七、Redis列表(list)类型参考记录(2)

作者: 温新

分类: 【Redis】

阅读: 1919

时间: 2020-08-31 15:27:18

列表(list)类型可以存储一个有序的字符串列表。常用操作是向列表两端添加元素,或者获得列表的某个片段。

列表类型内部使用双向链表(bouble linked list)实现,因此向两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。

缺点

通过索引访问元素比较慢。设想1000人排队买手机的场景画面,商家为了感谢粉丝的支持,决定奖励排在第 500名的这位顾客一部手机。为了找到这个顾客,商家需要从队首开始找。排得越靠后越花费时间。

经典使用场景

微博上的时事等有时效的内容。

基本命令

lpush 将一个或多个值插入列表头部

​ 语法:lpush key value1 [value2 ...]

127.0.0.1:6379> lpush number 1
(integer) 1
127.0.0.1:6379> lpush number 2 3
(integer) 3

lpush向列表左边增加元素。lpush先向列表左边加入2,然后再加入3。因此number键中的数据是3 2 1

rpush 向列表右边增加一个或多个值

​ 语法:rpush key value1 [value2 ...]

127.0.0.1:6379> rpush number 0 -1
(integer) 5

向列表右边增加了0和-1,此时列表中的值为 3 2 1 0 -1

lpop 从列表左边弹出一个元素并显示该值

​ 语法:lpop key

127.0.0.1:6379> lpop number
"3"

rpop 从列表右边弹出一个元素并显示该值

​ 语法:rpop key

127.0.0.1:6379> rpop number
"-1"

lpop/rpop命令2步骤下:1)移除列表左边的一个元素;2)返回被移除元素的值

llen 获取列表中元素的个数

​ 语法:llen key

127.0.0.1:6379> llen number
(integer) 3

key不存在时返回0

lrange 获取指定范围的元素

​ 语法:lrange key start end

# 获取所有元素
127.0.0.1:6379> lrange number 0 -1
1) "2"
2) "1"
3) "0"

# 获取前2个元素
127.0.0.1:6379> lrange number 0 1
1) "2"
2) "1"

1)若start索引位置比end索引位置靠后,则返回空列表

2)若end大于实际索引范围,则返回列表最右边的元素

lrem 删除列表中指定的值

​ 语法:lrem key count value

lrem删除列表中前count个值为value的元素,返回实际删除元素的个数。count值不同,lrem命令执行方式有些差异。

  1. 当 count > 0 时,lrem命令会从列表左边开始删除前count个值为value的元素;
  2. 当 count < 0 时,lrem命令会从列表右边开始删除前count个值为value的元素;
  3. 当 count = 0 时,lrem命令会删除所有值为value的元素。
127.0.0.1:6379> rpush number 2
(integer) 4
127.0.0.1:6379> lrange number 0 -1
1) "2"
2) "1"
3) "0"
4) "2"

# 从右边开始删除值为2的元素
127.0.0.1:6379> lrange number 0 -1
1) "2"
2) "1"
3) "0"
4) "2"
127.0.0.1:6379> lrem number -1 2
(integer) 1
127.0.0.1:6379> lrange number 0 -1
1) "2"
2) "1"
3) "0"

lindex 通过索引获取列表中的元素

​ 语法:lindex key index

127.0.0.1:6379> lindex number 0
"2"

lset 通过索引设置列表元素的值

​ 语法:lset key index value

# 列表元素中索引为1的值设置为7
127.0.0.1:6379> lset number 1 7
OK

ltrim 只保留列表指定片段的元素

​ 语法:ltrim key start stop

# 只保留索引为1和2对应的元素的值
127.0.0.1:6379> ltrim number 1 2
OK

ltrim可以删除指定索引范围之外的所有元素

linsert 在列表的元素前或后插入元素

​ 语法:linsert key before|after pivot value

127.0.0.1:6379> lrange number 0 -1
1) "7"
2) "0"
# 指定元素之后
127.0.0.1:6379> linsert number after 7 3
(integer) 3
127.0.0.1:6379> lrange number 0 -1
1) "7"
2) "3"
3) "0"

# 指定元素之前
127.0.0.1:6379> linsert number before 3 1
(integer) 4
127.0.0.1:6379> lrange number 0 -1
1) "7"
2) "1"
3) "3"
4) "0"

linsert先在列表中从左到右查找值为pivot的元素,然后根据第二个参数是before|after来决定将value插入到该元素前面还是后面

rpoplpush 将元素从一个列表转到另一个列表

​ 语法:rpoplpush source destination timeout

127.0.0.1:6379> rpoplpush number number1
"0"
127.0.0.1:6379> rpoplpush number number1
"3"

rpoplpush先从source列表类型的右边弹出一个元素;然后将它加入到destination列表类型的左边,并返回弹出的元素,整个过程原子性。

rpushx 为已存在的列表添加值

​ 语法:rpushx key value

127.0.0.1:6379> rpushx number 2
(integer) 3

lpushx 将值插入到已存在列表的头部

​ 语法:lpushx key value

127.0.0.1:6379> lpushx number 8
(integer) 4

blpop 移除并获取列表的第一个元素

​ 语法:blpop key1 [key2] timeout

127.0.0.1:6379> blpop number1 300
1) "number1"
2) "3"

移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

brpop 移除并获取列表的最后一个元素

​ 语法:brpop key1 [key2] timeout

127.0.0.1:6379> brpop number 200
1) "number"
2) "2"

移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。****

brpoplpush 从列表弹出一个值,将弹出的值插入到另外一个列表

​ 语法:brpoplpush source destination timeout

127.0.0.1:6379> brpoplpush number number1 500
"1"

从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

2020-08-31

请登录后再评论