Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >redis进阶之路-深入探索list

redis进阶之路-深入探索list

作者头像
热心的大肚皮
发布于 2023-02-28 05:57:59
发布于 2023-02-28 05:57:59
38300
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是热心的大肚皮,皮哥。

redis中的list是啥?

redis中的列表相当于java中的LinkedList,注意它是链表不是数组。当列表弹出最后一个元素,该数据结构被删除,内存被回收。

  • 插入、删除 - 时间复杂度O(1)
  • 索引定位 - 时间复杂度O(N)

redis中的列表也常用做异步队列,将需要延后处理的任务数据序列化成字符串存入列表,另一个线程从这个列表中轮询数据。

先进先出:队列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> rpush books python java golang
(integer) 3
> llen books 
(integer) 3
> lpop books
"python"
> lpop books
"java"
> lpop books
"golang"
> lpop books
(nil)

先进后出:栈

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> rpush books python java golang
(integer) 3
> llen books 
(integer) 3
> rpop books
"golang"
> rpop books
"java"
> rpop books
"python"
> rpop books
(nil)

以下慢操作使用时要格外注意。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> rpush books python java golang
(integer) 3
> lindex books #O(N)慎用
"java"
> lrange books 0 -1 # 获取所有元素,O(N)慎用
1) "python"
2) "java"
3) "golang"
> ltrim books 1 -1 # O(N)慎用

list如何实现?

数据量少时,使用一块连续内存存储-ziplist(压缩链表),数据量较多时,采用quicklist存储。如下图。

压缩链表-ziplist

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ziplist<T> {
    int32 zlbytes; // 整个压缩列表占用d的字节数
    int32 zltail_offset; //最后一个元素距离起始位置的偏移量
    int16 zllength;// 元素个数
    T[] entries;//  元素内容  
    int8 zlend; // 结束位,固定值 0xFF
}

struct entry {
    int<var> prevlen;//前一个entry的长度,支持倒序遍历使用
    int<var> encoding;//元素类型编码
    optional byte[] content;//内容
}

这么设计虽然在插入操作很方便,很快,但是也有个弊端,数据都是按照这种格式紧凑的放到一起没有冗余空间,那么每次修改时都要对压缩链表进行修改,要进行级联更新

快速链表-quicklist

如果list中数据过多,那性能怎么保证呢?这时候就用到了quicklist。它是ziplist与linkedlist的组合体。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ziplist<T> {
    ....
}

struct ziplist_compressed {
    int32 size;
    byte[] compressed_data;//内容
}

struct quicklistNode {
    quicklistNode* prev;
    quicklistNode* next;
    ziplist* zl;//对应的压缩列表
    int32 size;// ziplist的字节总数
    int16 count;// ziplist的元素数量
    int2 encoding;//存储方式,原生数组还是LZF压缩存储
    。。。
}

struct quicklist{
    quicklistNode* head;
    quicklistNode* tail;
    long count;//元素数量
    int nodes;//ziplist 节点个数
    int compressDepth;//LZF算法压缩深度
    。。。。
}

quicklist内部默认单个ziplist长度为8k字节,为了节约空间,还会对quicklist进行压缩,compressDepth为1时代表压缩深度为1,即首尾两个ziplist不压缩;compressDepth为2时代表压缩深度为2,即首尾两个ziplist不压缩及首尾第二个ziplist都不压缩。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿日常笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你确定不来了解一下Redis中List的原理吗
在上一章中我们介绍了 Hash的一些内部原理(《你确定不来了解一下Redis中Hash的原理吗》),在这一章中我们再来讨论在五种数据结构中 List 的基本使用和一些内部实现.
大数据真好玩
2019/08/08
1.2K0
Redis进阶-List底层数据结构精讲
Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合) 。
小小工匠
2021/08/17
7040
从源码看redis的list结构
执行插入,和一个数据结构相关,就是quicklist,quicklist的每一个节点为quicklistNode
爬蜥
2019/07/09
7200
Redis专题(2):Redis数据结构底层探秘
上篇文章 Redis闲谈(1):构建知识图谱介绍了redis的基本概念、优缺点以及它的内存淘汰机制,相信大家对redis有了初步的认识。互联网的很多应用场景都有着Redis的身影,它能做的事情远远超出了我们的想像。Redis的底层数据结构到底是什么样的呢,为什么它能做这么多的事情?本文将探秘Redis的底层数据结构以及常用的命令。
宜信技术学院
2019/06/18
6210
Redis专题(2):Redis数据结构底层探秘
不是吧?为了加快速度,Redis竟做了这么“疯狂”的设计
列表对象是 Redis 中 5 种基础数据类型之一,在 Redis 3.2 版本之前,列表对象底层存储结构有两种:linkedlist(双端列表)和 ziplist(压缩列表),而在 Redis 3.2 版本之后,列表对象底层存储结构只有一种:quicklist(快速列表),难道通过精心设计的 ziplist 最终被 Redis 抛弃了吗?
Java程序猿阿谷
2021/01/26
2900
不是吧?为了加快速度,Redis竟做了这么“疯狂”的设计
一口气说出Redis 5种数据结构及对应使用场景,面试要加分的
也当过面试官,面试过不少应聘者,因为是我自己招人自己用,所以我不会看应聘者造火箭的技术有多牛比,只看拧螺丝的手艺瓷不瓷实。毕竟以后是一个整体,拖了大家后腿团队都很难受。面试的题目一般也不会太难,就像问Redis,我只是想确认他真正用过就够了。Redis 5种基础数据结构和简单操作要知道,最基本的要求,如果这个时候他会说出每种数据结构大致的应用场景,那么这一定是加分的,起码要比那些只会说出几种数据结构后,在那干瞪眼等我问下一个问题的强很多,千万别冷场。
程序员小富
2020/02/17
3970
一口气说出Redis 5种数据结构及对应使用场景,面试要加分的
面试官:你看过Redis数据结构底层实现吗?
面试中,redis也是很受面试官亲睐的一部分。我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构。你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap、List、等使用的数据结构有什么区别呢。
用户5224393
2019/12/05
9370
Redis List(3)
在早期的版本中,数据量较小时用ziplist存储,达到临界值时转换为linkedlist进行存储,分别对应OBJ_ENCODING_ZIPLIST 和OBJ_ENCODING_LINKEDLIST。
兜兜毛毛
2020/03/19
5840
Redis系列之底层数据结构QuickList
在Redis3.2版本后,Redis推出了快速列表(QuickList)这种数据结构,之前的版本list都是元素少时用压缩列表(ZipList),元素多就用链表(LinkedList)。快速列表是一种双端链表的数据结构,QuickList用于处理Redis中List类型数据。
SmileNicky
2024/12/23
960
Redis系列之底层数据结构QuickList
Redis 还能这样用,真骚!
注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)
Bug开发工程师
2020/03/02
7750
Redis数据结构总结
字符串 string 是 Redis 最简单的数据结构。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。
用户5325874
2020/01/16
5450
Redis数据结构总结
【架构师修炼之路】Redis 极简教程 : 基本数据结构, 跳表原理
Github: https://github.com/antirez/redis
一个会写诗的程序员
2019/11/12
8590
Redis List 设计与实现
之前我们已经讨论过 Sorted Set 在 Redis 的实现,学习到了 Redis 在不同数据量的时候使用了不同的结构来优化存储和性能,并且使用两种不同的数据结构的组合来进一步优化。而今天要讨论的 List 也如出一辙。
LinkinStar
2023/10/18
1880
redis源码之list结构的实现
关于redis的list的常用命令就不多说了 常用的命令lpush,rpush,lpop,rpop,lrangge等,这个不错过多的演示,相信研究源码的同学应该都知道这些,唯一要说的就是在redis中有BRPOP等命令,这个是通过redisDb中的blocking_keys和ready_keys来实现,当然这个不是咱们这篇文章需要讨论的重点
程序员小饭
2020/09/26
6110
redis源码之list结构的实现
Redis数据结构:List类型全面解析
详细介绍:Redis五种数据类型、String、List、Set、Hash、ZSet
寻求出路的程序媛
2024/11/03
4150
Redis数据结构:List类型全面解析
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列
使用 Redis 实现消息队列 普通的订阅 基于模式(pattern)的发布/订阅 看下源码实现 分析下源码实现 stream 的结构 streamCG 消费者组 streamConsumer 消费者结构 分析下源码实现 基于List的消息队列 基于 Streams 的消息队列 发布订阅 总结 参考 ◆使用 Redis 实现消息队列 Redis 中也是可以实现消息队列 不过谈到消息队列,我们会经常遇到下面的几个问题 1、消息如何防止丢失; 2、消息的重复发送如何处理; 3、消息的顺序性问题; 关于 mq
IT大咖说
2022/03/21
1.3K0
跟着大彬读源码 - Redis 9 - 对象编码之 三种list
Redis 底层使用了 ziplist、skiplist 和 quicklist 三种 list 结构来实现相关对象。顾名思义,ziplist 更节省空间、skiplist 则注重查找效率,quicklist 则对空间和时间进行折中。
北国风光
2019/08/07
4990
跟着大彬读源码 - Redis 9 - 对象编码之 三种list
Redis五种数据类型
String 键值对 12345678910 > set name codehole OK > get name "codehole"> exists name (integer) 1 > del name (integer) 1 > get name (nil) 批量键值对 12345678910111213 > set name1 codehole OK > set name2 holycoder OK > mget name1 name2 name3 # 返回一个列表1) "codehole" 2)
兜兜转转
2023/03/06
2750
《闲扯Redis五》List数据类型底层之quicklist
Redis 中的 list 是我们经常使用到的一种数据类型,根据使用方式的不同,可以应用到很多场景中。
大道七哥
2020/04/24
1.3K0
揭秘Redis相关命令及应用:掌握命令,驾驭内存数据的力量
redis是Remote Dictionary Server的简称,即远程字典服务。
Lion Long
2024/11/05
1000
揭秘Redis相关命令及应用:掌握命令,驾驭内存数据的力量
推荐阅读
相关推荐
你确定不来了解一下Redis中List的原理吗
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验