redis-API-列表

文档地址

列表.png
列表类型有两个特点:

第一、列表中的元素是有序的,这就意味着可以
通过索引下标获取某个元素或者某个范围内的元素列表。

第二、列表中的元素可以是重复的,

内部编码

列表类型的内部编码有两种。
  • 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(消息队列)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容