列表对象的编码可以是ziplist
或者linkedlist
ziplist
编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点(entry
)保存了一个列表元素。
linkedlist
编码的列表对象使用双端列表作为底层实现,每个双端列表节点(node
)都保存了一个字符串对象,而每个字符串对象都保存了一个列表元素。
linklist
编码的列表对象在底层的双端列表中包含了多个字符串对象,这种嵌套字符串对象的行为在稍后介绍的哈希对象,集合对象和有序集合对象中都会出现,字符串对象是Redis
五种类型的对象中唯一一种会被其他四种类型对象嵌套的对象。
8.3.1 编码转换
当列表对象可以同时满足以下两个条件时,列表对象使用ziplist
编码
- 列表对象保存的所有字符串元素的长度都小于
64
字节; - 列表对象保存的元素数量小于
512
个;不能满足这两个条件的列表对象需要使用linkedlist
编码。
8.3.2 列表命令
1. BLPOP
BLPOP key [key ...] timeout
BLPOP
是列表的阻塞式(blocking
)弹出原语。
它是LPOP
命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被BLPOP
命令阻塞,直到等待超时或发现可弹出元素为止。
当给定多个key
参数时,按参数key
的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
2. BRPOP
BRPOP key [key ...] timeout
BRPOP
是列表的阻塞式(blocking
)弹出原语。
它是RPOP
命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被BRPOP
命令阻塞,直到等待超时或发现可弹出元素为止。
当给定多个key
参数时,按参数key
的先后顺序依次检查各个列表,弹出第一个非空列表的尾部元素。
3. BRPOPLPUSH
BRPOPLPUSH source destination timeout
BRPOPLPUSH
是RPOPLPUSH
的阻塞版本,当给定列表source
不为空时,BRPOPLPUSH
的表现和RPOPLPUSH
一样。
当列表source
为空时,BRPOPLPUSH
命令将阻塞连接,直到等待超时,或有另一个客户端对source
执行LPUSH
或RPUSH
命令为止。
超时参数timeout
接受一个以秒为单位的数字作为值。超时参数设为0
表示阻塞时间可以无限期延长(block indefinitely
) 。
4. LINDEX
LINDEX key index
返回列表key
中,下标为index
的元素。
下标(index
)参数start
和stop
都以0
为底,也就是说,以0
表示列表的第一个元素,以1
表示列表的第二个元素,以此类推。
你也可以使用负数下标,以-1
表示列表的最后一个元素,-2
表示列表的倒数第二个元素,以此类推。
如果key
不是列表类型,返回一个错误。
5. LINSERT
LINSERT key BEFORE|AFTER pivot value
将值value
插入到列表key
当中,位于值pivot
之前或之后。
当pivot
不存在于列表key
时,不执行任何操作。
当key
不存在时,key
被视为空列表,不执行任何操作。
如果key
不是列表类型,返回一个错误。
6. LLEN
LLEN key
返回列表key
的长度。
如果key
不存在,则key
被解释为一个空列表,返回0
.
如果key
不是列表类型,返回一个错误。
7. LPOP
LPOP key
移除并返回列表key
的头元素。
8. LPUSH
LPUSH key value [value ...]
将一个或多个值value
插入到列表key
的表头
如果有多个value
值,那么各个value
值按从左到右的顺序依次插入到表头: 比如说,对空列表mylist
执行命令LPUSH mylist a b c
,列表的值将是c b a
,
如果key
不存在,一个空列表会被创建并执行LPUSH
操作。
当key
存在但不是列表类型时,返回一个错误。
9. LPUSHX
LPUSHX key value
将值value
插入到列表key
的表头,当且仅当key
存在并且是一个列表。
和LPUSH
命令相反,当key
不存在时,LPUSHX
命令什么也不做。
10. LRANGE
LRANGE key start stop
返回列表key
中指定区间内的元素,区间以偏移量start
和stop
指定。
11. LREM
LREM key count value
根据参数count
的值,移除列表中与参数value
相等的元素。
count
的值可以是以下几种:
- count > 0 : 从表头开始向表尾搜索,移除与
value
相等的元素,数量为count
。 - count < 0 : 从表尾开始向表头搜索,移除与
value
相等的元素,数量为count
的绝对值。 - count = 0 : 移除表中所有与
value
相等的值。
12. LSET
LSET key index value
将列表key
下标为index
的元素的值设置为value
。
当index
参数超出范围,或对一个空列表(key
不存在)进行LSET
时,返回一个错误。
13. LTRIM
LTRIM key start stop
对一个列表进行修剪(trim
),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
举个例子,执行命令LTRIM list 0 2
,表示只保留列表list
的前三个元素,其余元素全部删除。
14. RPOP
RPOP key
移除并返回列表key
的尾元素。
15. RPOPLPUSH
RPOPLPUSH source destination
命令RPOPLPUSH
在一个原子时间内,执行以下两个动作:
- 将列表
source
中的最后一个元素(尾元素)弹出,并返回给客户端。
将source
弹出的元素插入到列表destination
,作为destination
列表的的头元素。
16. RPUSH
RPUSH key value [value ...]
将一个或多个值value
插入到列表key
的表尾(最右边)。
如果有多个value
值,那么各个value
值按从左到右的顺序依次插入到表尾:比如对一个空列表mylist
执行RPUSH mylist a b c
,得出的结果列表为a b c
.
17. RPUSHX
RPUSHX key value
将值value
插入到列表key
的表尾,当且仅当key
存在并且是一个列表。
和RPUSH
命令相反,当key
不存在时,RPUSHX
命令什么也不做。
网友评论