列表 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的链表可以保存各种不同类型的值。
本文探讨了Redis列表(list)的高效数据结构quickList,包括压缩列表(zipList)的使用,以及如何通过rpush和lpop操作实现高性能的异步队列。深入解析了Redis链表的双端特性及其实现细节。
982

被折叠的 条评论
为什么被折叠?



