Redis数据结构之列表
Posted 即使再小的帆也能远航!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis数据结构之列表相关的知识,希望对你有一定的参考价值。
列表类型用来存储多个有序的字符串,可以从两端进行插入(push)和弹出(pop)操作,获取指定范围的元素列表,获取指定索引的元素等
常用命令
添加
lpush:从左边插入元素
lpush key value1 value2 ...
rpush:从右边插入元素
rpush key value1 value2 ...
linsert:在某个元素前或后插入元素,返回列表长度
linsert key before|after pivot value
在d元素前添加e元素
127.0.0.1:6379[2]> rpush list a b c d
(integer) 4
127.0.0.1:6379[2]> linsert list before d e
(integer) 5
127.0.0.1:6379[2]> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "e"
5) "d"
查询
lrange:获取指定范围的元素列表
索引从0开始,最后一个元素的索引为-1
lrange key start end
获取全部元素:
lrange key 0 -1
lindex:获取指定索引下标的元素
lindex key index
获取最后一个元素:
lindex key -1
llen:获取列表长度
llen key
删除
lpop:从左侧弹出元素(删除并返回)
lpop key
127.0.0.1:6379[2]> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "e"
5) "d"
127.0.0.1:6379[2]> lpop list
"a"
127.0.0.1:6379[2]> lrange list 0 -1
1) "b"
2) "c"
3) "e"
4) "d"
rpop:从右侧弹出元素(删除并返回)
rpop key
lrem:删除指定元素
lrem key count value
lrem会从列表中找到value元素进行删除,根据count分为三种情况:
- count > 0:从左到右,删除最多
count
个元素。 - count < 0:从右到左,删除最多
count
绝对值 个元素。 - count = 0,删除所有
除了lpop和rpop两个弹出命令外,还有两个弹出命令,叫做阻塞弹出,分别是blpop
和brpop
blpop:规定时间内获取并移除数据,timeout:单位为秒
blpop key timeout
如果列表不为空,就立刻返回列表和弹出的元素
127.0.0.1:6379[2]> blpop list 10
"list"
"a"
如果列表为空,就阻塞timeout长时间,如果指定时间内其他客户端没有添加元素就返回nil,如果指定时间内其他客户端添加了元素 ,就返回列表和弹出的元素
127.0.0.1:6379[2]> blpop list 10
(nil)
(10.05s)
修改
lset:修改指定索引下标的元素
lset key index newValue
修改列表索引为0的元素为b:
127.0.0.1:6379[2]> lrange list 0 -1
1) "c"
2) "f"
3) "e"
127.0.0.1:6379[2]> lset list 0 b
OK
127.0.0.1:6379[2]> lrange list 0 -1
1) "b"
2) "f"
3) "e"
内部编码
列表类型内部有2种编码:
- ziplist(压缩列表):当列表的元素个数 小于
list-max-ziplist-entries
配置(默认512
个)并且每个元素的值都小于list-max-ziplist-value
配置时(默认64
字节),Redis就会采用ziplist来减少内存的使用 - linkedlist(链表列表):当 列表类型 无法满足
ziplist
的条件时,Redis
会使用linkedlist
作为 列表 的 内部实现。
可以使用object encoding key
查看当前编码
当元素小于521个,且元素值小于64字节
127.0.0.1:6379> rpush listkey e1 e2 e3
(integer) 3
127.0.0.1:6379> object encoding listkey
"ziplist"
当元素大于521个
27.0.0.1:6379> rpush listkey e4 e5 ... e512 e513
(integer) 513
127.0.0.1:6379> object encoding listkey
"linkedlist"
Redis3.2
版本提供了 quicklist
内部编码,简单地说它是以一个 ziplist
为 节点 的 linkedlist
,它结合了 ziplist
和 linkedlist
两者的优势,为 列表类型 提供了一种更为优秀的 内部编码 实现
常用场景
消息队列
通过
lpush
和brpop
可以实现消息队列,生产方通过lpush添加元素,多个消费方通过brpop获取元素
栈
通过
lpush
和lpop
可以实现栈
分页功能
通过
lrange
可以实现列表的分页功能
以上是关于Redis数据结构之列表的主要内容,如果未能解决你的问题,请参考以下文章