Redis中列表类型是用来存储多个有序的字符串,列表中的每个字符串成为元素(element),一个列表最多可以存储232 - 1个元素。
列表中的数据会按照插入顺序进行排序。不过,该列表的底层实际是一个无头节点的双向链表,所以对列表表头与表尾的操作性能较高,但对中间元素的插入与删除的操作的性能相对较差。
在一般要求顺序的业务中,一般都用list来实现。
命令
- lpush/rpush
- 格式:lpush key value [value …] 或 rpush key value [value …]
- 功能:将一个或多个值 value 插入到列表 key 的表头/表尾(表头在左,表尾在右)
- 说明:如果有多个 value 值,对于 lpush 来说,各个 value 会按从左到右的顺序依次插入到表头;对于 rpush 来说,各个 value 会按从左到右的顺序依次插入到表尾。如果 key不存在,一个空列表会被创建并执行操作。当 key 存在但不是列表类型时,返回一个错误。执行成功时返回列表的长度。
- llen
- 格式:llen key
- 功能:返回列表 key 的长度。
- 说明:如果 key 不存在,则 key 被解释为一个空列表,返回 0 。如果 key 不是列表类型,返回一个错误。
- lindex
- 格式:lindex key index
- 功能:返回列表 key 中,下标为 index 的元素。列表从 0 开始计数。
- 说明:如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。
- lset
- 格式:lset key index value
- 功能:将列表 key 下标为 index 的元素的值设置为 value 。
- 说明:当 index 参数超出范围,或对一个空列表(key 不存在)进行 lset 时,返回一个错误。
- lrange
- 格式:lrange key start stop
- 功能:返回列表 key 中指定区间[start, stop]内的元素,即包含两个端点。
- 说明:List 的下标从 0 开始,即以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。超出范围的下标值不会引起错误。如果 start 下标比列表的最大下标 还要大,那么 lrange 返回一个空列表。如果 stop 下标比最大下标还要大,Redis 将 stop 的值设置为最大下标。
- lpushx 与 rpushx
- 格式:lpushx key value 或 rpushx key value
- 功能:将值 value 插入到列表 key 的表头/表尾,当且仅当 key 存在并且是一个列表。
- 说明:当 key 不存在时,命令什么也不做。若执行成功,则输出表的长度。
- linsert
- 格式:linsert key [ before | after ] pivot value
- 功能:将值 value 插入到列表 key 当中,位于元素 pivot 之前或之后。
- 说明:当 pivot 元素不存在于列表中时,不执行任何操作,返回-1;当 key 不存在时,key 被视为空列表,不执行任何操作,返回 0;如果 key 不是列表类型,返回一个错误;如果命令执行成功,返回插入操作完成之后,列表的长度。
- lpop 与 rpop
- 格式:lpop key [count] 或 rpop key [count]
- 功能:从列表 key 的表头/表尾移除 count 个元素,并返回移除的元素。count 默认值 1。
- 说明:当 key 不存在时,返回 nil。
- blpop 与 brpop
-
格式:blpop key [key …] timeout 或 brpop key [key …] timeout
-
功能:blpop / brpop是列表的阻塞式(blocking)弹出命令。它们是 lpop / rpop 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 blpop / brpop命令阻塞,直到等待 timeout 超时或发现可弹出元素为止。当给定多个 key 参数时,按参数 key的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。timeout 为阻塞时长,单位为秒,其值若为 0,则表示只要没有可弹出元素,则一直阻塞。
-
说明:假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
-
list1,list2和list3均为空列表,blpop会从左向右依次检查这三个列表是否为空,如果不为空就返回那个列表的第一个元素和那个列表的名字。
-
list1,list2和list3均为空列表,会阻塞30s。在30s的时间内,向list2插入元素(c,b,a),blpop检测到list2中存在元素,并pop掉list2头部的第一个元素。pop之后阻塞被解除。
-
brpop也是类似,只不过pop的是列表尾部的第一个元素。
- rpoplpush
- 格式:rpoplpush source destination
- 功能:命令 rpoplpush 在一个原子时间内,执行以下两个动作:将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。如果 source 不存在,值 nil 被返回,并且不执行其他动作。如果 source 和 destination相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。
- brpoplpush
- 格式:brpoplpush source destination timeout
- 功能:brpoplpush 是 rpoplpush 的阻塞版本,当给定列表 source 不为空时,brpoplpush的表现和 rpoplpush一样。当列表 source 为空时, brpoplpush命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 lpush或 rpush命令为止。timeout 为阻塞时长,单位为秒,其值若为 0,则表示只要没有可弹出元素,则一直阻塞。
- 说明:假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。
sour2和dest2原本均为空。在15秒之内,向sour2插入元素(a,b,c),brpoplpush 指令将c这个元素从sour2中弹出,插入到dest2中,并解除阻塞。
- lrem
-
格式:lrem key count value
-
功能:根据参数 count 的值,移除列表中与参数 value 相等的元素。count 的值可以是以下几种:
- count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
- count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
- count = 0 : 移除表中所有与 value 相等的值。
-
说明:返回被移除元素的数量。当 key 不存在时, lrem命令返回 0 ,因为不存在的 key 被视作空表(empty list)。
- ltrim
- 格式:ltrim key start stop
- 功能:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
- 说明:下标(index)参数支持正数索引和负数索引。当 key 不是列表类型时,返回一个错误。如果 start 下标比列表的最大下标 end ( llen list 减去 1 )还要大,或者 start > stop , ltrim返回一个空列表,因为 ltrim已经将整个列表清空。如果 stop 下标比 end 下标还要大,Redis 将 stop 的值设置为 end 。
使用场景
消息队列
l如下图所示,Redis的lpush + brpop命令组合即可实现阻塞队列,生产者客户端使用lpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的争抢列表尾部的元素,多个客户端保证了消费的负载均衡和高可用;