六、Redis列表(list)类型参考记录(1)
列表(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