文档地址
列表类型有两个特点:
第一、列表中的元素是有序的,这就意味着可以
通过索引下标获取某个元素或者某个范围内的元素列表。
第二、列表中的元素可以是重复的,
内部编码
列表类型的内部编码有两种。
ziplist(压缩列表):
当列表的元素个数小于list-max-ziplist-entries配置
(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时
(默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使
用。linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用
linkedlist作为列表的内部实现。
使用说明
1.消息队列
生产者消费者模式:
生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有;(lpush+brpop)
发布者订阅者模式:
发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的;(Subscribe)
Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
2.文章列表
每个用户有属于自己的文章列表,现需要分页展示文章列表。此时可以
考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。
设计方式:
对于文章的内容可以使用哈希去存储,一个用户可以使用一个列表保存
使用
使用lrange取文章的列表
问题
如果每次分页获取的文章个数较多,需要执行多次hgetall操作,此时可以考虑使用
Pipeline批量获取,或者考虑将文章数据序列化为字符串类
型,使用mget批量获取。分页获取文章列表时,lrange命令在列表两
端性能较好,但是如果列表较大,获取列表中间范围的元素性能会变差,此
时可以考虑将列表做二级拆分,或者使用Redis3.2的quicklist内部编码实现,
它结合ziplist和linkedlist的特点,获取列表中间范围的元素时也可以高效完
成。
使用总结
- lpush+lpop=Stack(栈)
- lpush+rpop=Queue(队列)
- lpsh+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)