redis之列表

列表list)类型是用来存储多个 有序字符串。在 Redis 中,可以对列表的 两端 进行 插入push)和 弹出pop)操作,还可以获取 指定范围元素列表、获取 指定索引下标元素 等。

列表 是一种比较 灵活数据结构,它可以充当 队列 的角色,在实际开发上有很多应用场景。

内部编码

列表类型的 内部编码 有两种:

ziplist(压缩列表)

当列表的元素个数 小于 list-max-ziplist-entries 配置(默认 512 个),同时列表中 每个元素 的值都 小于 list-max-ziplist-value 配置时(默认 64 字节), Redis会选用 ziplist 来作为 列表内部实现 来减少内存的使用。

linkedlist(链表)

列表类型 无法满足 ziplist 的条件时, Redis 会使用 linkedlist 作为 列表内部实现

编码转换

  • 当元素 个数较少没有大元素 时,内部编码ziplist

  • 当元素个数超过 512 个,内部编码 变为 linkedlist

  • 当某个元素超过 64 字节内部编码 也会变为 linkedlist

Redis3.2 版本提供了 quicklist 内部编码,简单地说它是以一个 ziplist节点linkedlist,它结合了 ziplistlinkedlist 两者的优势,为 列表类型 提供了一种更为优秀的 内部编码 实现。

应用场景

消息队列

通过 Redislpush+brpop 命令组合,即可实现 阻塞队列

生产者客户端 使用 lrpush 从列表 左侧插入元素多个消费者客户端 使用 brpop 命令 阻塞式“抢” 列表 尾部 的元素,多个客户端 保证了消费的 负载均衡高可用性

文章列表

每个 用户 有属于自己的 文章列表,现需要 分页 展示文章列表。此时可以考虑使用 列表,因为列表不但是 有序的,同时支持 按照索引范围 获取元素。

命令组合 对应数据结构
lpush + lpop Stack(栈)
lpush + rpop Queue(队列)
lpush + ltrim Capped Collection(有限集合)
lpush + brpop Message Queue(消息队列)