redis基本数据类型——②列表

本文探讨了Redis列表(list)的高效数据结构quickList,包括压缩列表(zipList)的使用,以及如何通过rpush和lpop操作实现高性能的异步队列。深入解析了Redis链表的双端特性及其实现细节。

列表 list:(rpush,lpop,lrange)

  • Redis 的列表相当于 Java 中的 LinkedList,插入和删除的速度非常快,时间复杂度为 O(1),但查找数据很慢,时间复杂度为 O(n) 。
  • 可以用来做异步队列:将需要延后处理的任务序列化为字符串,塞进 redis 的 list 列表中,然后另一个线程从这个列表中轮询数据进行处理。rpush 生产消息,lpop 消费消息。当 lpop 没有消息时,可以使用 blpop,它会阻塞住直到消息到来。
  • rpush 表示右边进,lpop 表示左边出,构成的是一个队列。
  • rpush 右边进,rpop 右边出,构成的是一个栈。

list 深入研究

  • Redis 底层存储的并不是一个简单的 LinkedList,而是快速链表 quickList
  • 首先在列表元素较少时,使用一块连续的内存来存储,这个结构叫 zipList,也就是压缩列表,它将所有元素紧挨着一起存储,分配的是一块连续的内存。
  • 当数据量较多时,改为 quickList,这么做的原因是:普通的链表需要附加的指针会占用空间,而且加重了内存的碎片化。所以 Redis 将链表和 zipList 结合组成了 quickList,它将多个 zipList 通过双向指针串起来,这样既能满足快速的插入删除性能,又不会出现太大的空间冗余。

(以下出自 Redis 设计与实现,仅作了解)

redis中链表是什么结构的?

  • 双端:链表节点带有pre和next指针,获取某个节点的前置和后置节点的时间复杂度都是O(1)
  • 无环:表头节点的pre指针和表尾节点的next指针都指向null
  • 带表头指针和表尾指针
  • 带链表长度计数器
  • 多态:可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以redis的链表可以保存各种不同类型的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值