七、Redis列表(list)类型参考记录(2)
列表(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命令执行方式有些差异。
- 当 count > 0 时,lrem命令会从列表左边开始删除前count个值为value的元素;
- 当 count < 0 时,lrem命令会从列表右边开始删除前count个值为value的元素;
- 当 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