列表(list)类型是用来存储多个有序的字符串,一个列表最多可以储存2^32 - 1个元素,列表是比较灵活的数据结构,它可以充当栈和队列的角色。
列表类型特点:
1.列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素。
2.列表中的元素可以是重复的
命令:
插入:
-- 从右边插入
rpush key value [value ...]
-- 从左侧插入
lpush key value [value...]
-- 向某个元素前或后插入元素
linsert key before|after element value
linsert 命令会从列表中找到等于element的元素,在其前或者后插入一个新的元素value
查找:
-- 获取指定范围内的元素列表
lrange key start end
lrange 操作会获取列表指定索引范围的所有元素。索引下标从左到右分别是0 ~ N-1, 并且 lrange的end包含本身
-- 获取列表指定索引下标的元素
lindex key index
获取最后一个元素可以为lindex key -1
-- 获取列表长度
llen key
删除:
--从列表左侧弹出元素
lpop key
--从列表有测弹出元素
rpop key
--删除指定元素
lrem key count value
lrem命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况,
count > 0 从左到右,删除最多count个元素
count < 0 从右到左,删除最多count绝对值个元素
count = 0 删除所有
-- 按照索引范围修剪列表
ltrim key start end
ltrim操作会使列表保留start--end之间的元素,包含start end对应的元素
修改:
-- 修改指定索引下标的元素
lset key index newValue
阻塞:
-- 阻塞式弹出
blpop key [key...] timeout
brpop key [key...] timeout
blpop和brpop是lpop和rpop的阻塞版本,
参数说明:
--key [key...] 多个列表的键
--timeout:阻塞时间(单位:秒)
列表为空:如果timeout=3,那么客户端要等到3秒后返回,如果timeout=0,那么客户端一直阻塞等下去,但是如果在阻塞期间,其他客户端添加了数据,使列表不为空,则会立即返回
列表不为空,客户端会立即返回
--在使用brpop时有两点需要注意
第一点:如果多个键,那么brpop会从左至右遍历键,一旦有一个键能弹出元素,客户端变会立即返回,如果此时另一个客户端向空列表中插入数据,客户端会立即返回相应的列表弹出的元素。
第二点:如果多个客户端对同一个键执行brpop,那么最先执行brpop命令的客户端可以获取到弹出的值
-- 内部编码:
ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素 的值都小于list-max-ziplist-value配置(默认64字节),Redis会选用ziplist来作为列表的内部实现,来减少内存的使用。
linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。
quicklist:Redis 3.2提供,是以一个ziplist为节点的linkedlist,参考微博:https://matt.sh/redis-quicklist
-- 使用实例
消息队列:
lpush+brpop组合可实现阻塞消息队列,生产者客户端使用lpush从列表左侧插入元素,多个消费者客户端从列表右侧使用brpop命令阻塞式的抢列表尾部的元素,多个客户端保证了消费者的负载均衡和高可用性。
--------------------------------------------------------------------------------------------------------------------------------
lpush + lpop = stack(栈)
lpush + rpop = Queue(队列)
lpush + ltrim = Capped Collection(有限集合)
lpush + brpop = Message Queue(消息队列)