一、概述
Redis中列表(list)类型是用来存储多个有序的字符串,列表中的每个字符串成为元素(element),一个列表最多可以存储2^32 - 1个元素。
在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,可以充当栈和队列的角色,在实际开发中有很多应用场景。
列表类型有以下特点:
-
列表中的元素是有序的,即可以通过索引下标获取某个元素或者某个范围内的元素列表;
-
列表中的元素可以是重复的;
二、常用命令
1.添加操作:
-
rpush key value [value...]:从右边插入元素;
-
lpush key value [value...]:从右边插入元素;
-
linsert key before | after pivot value:向某个元素前/后插入元素,返回结果为当前列表长度;
2.查找操作:
-
lrange key start end:获取指定范围内的元素列表;如lrange key 0 -1,获取列表全部元素;
-
lindex key index:获取列表指定索引下标的元素,如lindex key -1,获取最后一个元素;
-
llen key:获取列表长度;
3.删除操作:
-
lpop key :从列表左侧弹出元素;
-
rpop key :从列表右侧弹出元素;
-
lrem key count value:lrem命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况;
-
count>0,从左到右,删除最多count个元素;
-
count<0,从右到左,删除最多count绝对值个元素;
-
count=0,删除所有元素。
-
-
ltrim key start end:按照索引范围修建列表,相当于切片操作。
4.修改操作:
- lset key index newValue:修改指定下标的元素
5.阻塞操作:
阻塞式弹出:
-
blpop key [key ...] timeout
-
brpop key [key....] timeout
三、内部编码
列表类型的内部编码有两种,分别如下:
-
ziplist(压缩列表):当列表的元素个数小于list -max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置(默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用;
-
linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现;
-
quicklist:Redis3.2版本提供了quicklist内部编码,是以一个zpilist为节点的linkedlist,结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现。
四、应用场景
1.消息队列:
如下图所示,Redis的lpush + brpop命令组合即可实现阻塞队列,生产者客户端使用lpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的争抢列表尾部的元素,多个客户端保证了消费的负载均衡和高可用;

2.文章列表:
利用队列FIFO的特性可以设计出最近文章列表功能或者指定特性的最新文章列表等,在设计文章列表时,应充分考虑其获取操作的性能,如批量获取操作、批量插入操作;
3.应用场景总结:
实际上列表的使用场景分舵,在选择时可以参入如下策略:
-
lpush + lpop = Stack(栈)
-
lpush + rpop = Queue(队列)
-
lpush + ltrim = Capped Collention(有限集合)
-
lpush + brpop = Message Queue(消息队列)
感谢阅读~
参考资料:
《Redis开发与运维》
网友评论