美文网首页Redis
redis-API-列表

redis-API-列表

作者: PHP的艺术编程 | 来源:发表于2018-12-12 15:01 被阅读1次

    文档地址

    列表.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(消息队列)

    相关文章

      网友评论

        本文标题:redis-API-列表

        本文链接:https://www.haomeiwen.com/subject/pxxphqtx.html