浅谈redis数据结构之列表

1. 列表

       上一篇文章:浅谈redis数据结构之字符串。本篇文章我们谈谈列表。

       列表(list)类型是用来存储多个有序的字符串。列表是一种比较灵活的数据结构,它可以充当栈(Stack)和队列(Queue)的角色,在实际开发上有很多应用场景。

       在redis中,可以对列表的两端进行push和pop操作,还可以获取指定范围的元素列表、获取指定索引下标的元素等。下面通过一个简单的例子,说明下这些个操作:假如有a,b,c,d,e五个元素从左往右组成一个有序的列表,极限情况,这个列表可以存储2 ^ 32 - 1个元素。

  • 列表的push和pop

浅谈redis数据结构之列表

  • 列表的获取/截取/删除

浅谈redis数据结构之列表

2. redis中列表的操作命令

       针对列表的五种操作类型,redis提供的操作命令如下图所示:

浅谈redis数据结构之列表

       具体基础命令操作如下图所示:

浅谈redis数据结构之列表

浅谈redis数据结构之列表

浅谈redis数据结构之列表

浅谈redis数据结构之列表

      基础命令介绍完了,下图给出了这些基础命令的时间复杂度

浅谈redis数据结构之列表

3. 内部编码

3.1 ziplist

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

3.2 linkedlist

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

利用上面基础命令操作完的列表,做个编码转换的展示,如下图所示:

浅谈redis数据结构之列表

浅谈redis数据结构之列表

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

4. 应用场景

4.1 消息队列

       通过Redis的lpush + brpop命令组合,即可实现阻塞队列。如图所示:

浅谈redis数据结构之列表

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

4.2 其他场景

      实际上列表的使用场景很多,具体可以参考如下:

浅谈redis数据结构之列表

5. 后续

       下一篇文章中,我们研究下哈希类型的数据结构:浅谈redis数据结构之哈希。