Redis使用篇 - 列表对象
列表对象
一个列表对象最多可以存储2^32 - 1个元素。
.
编码
3.2.0版本之前
ziplist、linkedlist
3.2.0版本以及之后
quicklist
.
ziplist
ziplist编码的列表对象使用压缩列表作为底层实现。每个压缩列表节点保存一个列表元素。
.
linkedlist
linkedlist编码的列表对象使用双向链表作为底层实现。每个双向链表节点保存了一个字符串对象,每个字符串对象保存了一个列表元素。
(注意:图8-6使用的仅仅是简化的字符串对象表示)
.
编码转换
当列表对象可以同时满足以下两个条件时,列表对象使用ziplist编码:
1. 列表对象保存的所有字符串元素的长度都小于等于64字节。(list-max-ziplist-value)
2. 列表对象保存的元素数量小于等于512个。(list-max-ziplist-entries)
否则使用linkedlist编码。
.
quicklist
快速列表的节点使用linkedlist来存储,而每个linkedlist节点使用ziplist存储,每个ziplist节点存储实际的列表元素。
.
使用场景
-
简单的消息队列
使用brpop、lpush 命令或者 blpop、rpush 命令。
-
分页、列表显示数据
使用lrange、ltrim等命令。
-
队列、栈、容量有限的集合
使用lpush、rpop 或者 rpush、lpop命令。
使用lpush、lpop 或者 rpush、rpop命令。
使用lpush、ltrim 或者 rpush、 ltrim命令。
.
命令
-
lpush
添加元素到列表的表头。
lpush key value [value…]
-
lpushx
列表存在时,才可以添加元素到列表的表头。
lpushx key value [value…]
-
lpop
移除并返回列表的表头元素。
lpop key
-
llen
返回列表中元素的个数。
llen key
-
lindex
返回指定索引位置的元素。
lindex key index
-
linsert
在指定元素之前或者之后,插入元素。
linsert key before|after pivot value
-
lrange
返回指定范围内的所有元素。
lrange key start stop
-
lrem
删除指定数量的值为给定值的元素。(count > 0,从表头到表尾的顺序删除元素;count < 0,从表尾到表头的顺序删除元素;count = 0,删除所有值为给定值的元素)
lrem key count value
-
lset
设置指定索引位置的元素的值为给定值。
lset key index value
-
ltrim
裁剪列表。
ltrim key start stop
-
blpop
给定超时时间内,移除并返回表头元素。(从左至右的顺序,查找非空列表,依次弹出元素)timeout以秒为单位,0表示没有元素则永久阻塞。
blpop key [key…] timeout
-
rpop
移除并返回表尾元素。
rpop key
-
rpush
添加元素到表尾。
rpush key value [value…]
-
rpushx
当列表存在时,才可以添加元素到表尾。
rpushx key value [value…]
-
rpoplpush
移除第一个列表的表尾元素到第二个列表的表头。
rpoplpush source destination
-
brpoplpush
给定超时时间(以秒为单位,0表示永久阻塞),移除第一个列表的表尾元素到第二个列表的表头。
brpoplpush source destination timeout