当前位置:

首页 > 编程开发 > Redis数据结构类型实例代码分析

Redis数据结构类型实例代码分析

Redis Assistant
Redis Assistant

Redis Assistant 是一款为Redis设计的高效可视化管理与监控工具,提供多种操作模式,高效处理服务器数据。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

立即下载
¥19
Windows/macOS/Linux 2026-08-22
正版软件 Windows macOS软件 Linux 数据库管理工具

intset当set集合存储的是整数时,encoding为intset类型(小整数集合)typedefstructintset{int32encoding;int32length;intcontents[];}字段描述说明encoding决定整数位宽是16位、32位还是64位枚举表示length元素个数contents整数数组,存储元素值intset按照从小到大的顺序保存元素。存储元素时,根据整数大小决定是否要将encoding升级,找到要插入元素的位置,如果不是最后一位,会将所在位置之后的元素后移一位,

本文目录

    intset

    当set集合存储的是整数时,encoding为intset类型(小整数集合)

    typedef struct intset {
        int32 encoding;
        int32 length;
        int contents[];
    }
    字段描述说明
    encoding决定整数位宽是16位、32位还是64位枚举表示
    length元素个数
    contents整数数组,存储元素值

    intset按照从小到大的顺序保存元素。存储元素时,根据整数大小决定是否要将encoding升级,找到要插入元素的位置,如果不是最后一位,会将所在位置之后的元素后移一位,最后插入元素。如果插入的元素不为整数,存储形式将变成hash结构。

    ziplist

    当hash与zset满足如下条件条件时,编码类型为ziplist(压缩列表),具体可在配置文件中查看。

    hash-max-ziplist-entries 512 # 当hash元素个数小于512时
    hash-max-ziplist-value 64 # 当hash键或值长度小于64时
    zset-max-ziplist-entries 128 # 当zset元素个数小于128时
    zset-max-ziplist-value 64 # 当zset值小于64时
    typedef struct ziplist {
        int32 zlbytes;
        int32 zltail_offset;
        int16 zllength;
        T[] entries;
        int8 zlend;
    }
    typedef struct entry {
        int prevlen;
        int encoding;
        byte[] content;
    }
    字段描述说明
    zlbytesziplist所占字节数
    zltail_offset最后一个元素距离压缩列表起始位置的偏移量用于快速定位到最后一个节点,然后倒序遍历
    zllength元素个数
    entries压缩元素
    zlend标志压缩列表的结束恒为FF
    字段描述说明
    prevlen前一个entry的字节长度第一个entry恒为0,字节长度动态变化,当字符串长度小于254时,用一个字节,否则用五个字节
    encoding编码类型编码类型根据元素内容动态变化,极为复杂,本篇不作详细描述,具体可搜索ziplist编码类型
    content元素内容,可选

    下图是一个ziplist的demo

    Redis数据结构类型实例代码分析

    • 第1-4字节,zlbytes为25,说明该压缩列表共占用25个字节

    • 第5-8字节,zltail_offset为22,说明最后一个元素从22开始

    • 第9-10字节,zllength为3,说明共有3个元素

    • 第11-16字节,第一个entry: 其中prevlen=0,因为它前面没有数据项;encoding=4,表示后面4byte按照字符串存储,数据的值为name

    • 第17-21字节,第二个entry: 其中prevlen=6,表示前一个entry共占用6byte;encoding=3,表示后面3byte按照字符串存储,数据的值为why

    • 第22-24字节,第三个entry: 其中prevlen=5,表示前一个entry共占用5byte;encoding=0xFE,表示后面1byte存储整数,数据的值为14

    • 第25字节,zlend为FF,标志压缩列表的结束

    当用ziplist存储hash结构时,将key与value分别当作一个entry存储。

    可见压缩列表存储非常的紧凑,当某一个entry长度变为254时,下一个entry的prevlen将从1个字节扩展到5个字节,这就是级联更新

    quicklist

    quicklist(快速列表)用于存储list集合,它是ziplist与linkedlist的混合体,linkedlist与双向列表结构类似。

    quicklist内部默认单个ziplist长度为8K,超过这个长度,就会另起一个node,可在配置文件中配置。

    # -2表示8k,枚举类型可在配置文件中查看
    list-max-ziplist-size -2

    quicklist默认的压缩深度为0,也就是不压缩。如果压缩深度为1,那么就是首尾不压缩,如果压缩深度为2,那么就是首2个、尾2个不压缩,可在配置文件中配置。

    list-compress-depth 0

    skiplist

    zset使用dict存储value与score的映射,另一方面还需要按照score提供排序功能,于是就有了skiplist(跳跃列表)

    先看skiplist的一个demo

    Redis数据结构类型实例代码分析

    typedef struct zsl {
        zslnode* header;
        zslnode* tail;
        int maxLevel;
    }
    typedef struct zslnode {
        sds value;
        double score;
        zslforward*[] forwards;
        zslnode* backward;
    }
    typedef struct zslforward {
        zslnode* item;
        int span;
    }
    字段描述说明
    header指向跳跃列表的头指针value固定为NULL,score固定为0,backward为null
    tail指向跳跃列表的尾指针
    maxLevel当前跳跃表最大层数最大为64
    value用于存储字符串类型的数据
    score用于存储分值
    backward回退节点图中的←箭头
    forwards前进节点图中的→箭头,每一层对应一个
    span跨度,存储一个节点跳到下一个节点中间跳过了多少节点如score1指向score5,则span值为4,这是排名的实现原理

    最小分值的backward固定null,对于每一个新插入的节点,会调用一个随机算法,来给它分配一个合理的层数

    level1的概率为1-0.25=0.75,实际为100%,因为跳跃列表的最小层数为1

    level2的概率为0.75*0.25=0.1875level3的概率为0.1875*0.25=0.0468 ......

    leveln的概率为(1-0.25)*Math.pow(0.25,n-1)

    总结

    Redis作为单线程内存服务,在响应、数据结构上作出了很多的优化,值得我们学习

    对象类型编码类型
    stringint、raw、embstr
    listquicklist
    hashdict、ziplist
    setintset、dict
    zsetziplist、skiplist+dict

    HyperLogLog

    HyperLogLog的原理为伯努利试验,即丢硬币,根据连续出现反面的次数X,推算出一共丢了2的X次方次硬币,当X很大时,推算出来的总数与实际总数误差就很接近了。具体可查询其他文章。

    pfadd

    element经过hash算法之后是一个64位的固定值

    低14位为桶

    查找高50位第一个为1的位数,如果大于当前桶的位数,就将其设置为当前桶的位数

    假设hash值是 :{此处省略45位}01100 00000000000101

    • 低14位的二进制转为10进制,值为5(regnum),即我们把数据放在第5个桶

    • 高50位第一个1的位置是3,即count值为3

    • registers[5]取出历史值oldcount

    • 如果count > oldcount,则更新 registers[5] = count

    • 如果count <= oldcount,则不做任何处理

    HyperLogLog用了16384个桶,每个桶占用6bit,因此说一个HyperLogLog所占用内存是12K。

    调和平均数:

    假设我的工资为10_000,马云的工资为1_000_000,那我和马云的平均工资为505_000,我肯定是不认同的。。。

    如果使用调和平均数,则为2/(1/10_000+1/1_000_000)=19_801

    同理,桶位数的平均数为:n/(1/桶1位数+1/桶2位数+...+1/桶n位数)

    桶的平均个数为:Math.pow(2,桶位数的平均数)

    总数量:const*桶总数n*桶的平均个数,其中constant为不定值,与桶个数有关,假设m为桶个数,取对数

    pfcount

    p=log2m
    switch (p) {
       case 4:
           constant = 0.673 * m * m;
       case 5:
           constant = 0.697 * m * m;
       case 6:
           constant = 0.709 * m * m;
       default:
           constant = (0.7213 / (1 + 1.079 / m)) * m * m;
    }
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    php72w redis,docker php7安装php-redis
    php72w redis,docker php7安装php-redis

    在Docker环境下为PHP安装Redis扩展:手动编译需下载源码、安装phpize、配置编译并安装,生成redis.so并在php.d目录新建redis.ini加载,重启PHP-FPM;也可直接yum安装php72w-pecl-redis,免手动编译。

    php 如何配置 redis,php 如何设置redis
    php 如何配置 redis,php 如何设置redis

    配置PHP的Redis扩展:先安装Redis服务,从GitHub下载phpredis源码,用phpize编译安装,修改php.ini添加extension=redis.so,重启php-fpm或Apache,通过phpinfo验证并连接Redis。

    c++如何将结构体序列化为Redis兼容的RESP协议格式【深度】
    c++如何将结构体序列化为Redis兼容的RESP协议格式【深度】

    C++结构体无法直接序列化为RESP协议,需手动将字段映射为*N数组嵌套$lenbulkstring形式。整数需转换为字符串并加:前缀,空字符串用$0\r\n,null用$-1\r\n。长度计算需精确到字节数,特别注意二进制安全,同时确保字段顺序与结构体定义一致。

    如何在Golang架构中部署Redict作为高能数据临时存储中转站
    如何在Golang架构中部署Redict作为高能数据临时存储中转站

    Redis作为跨服务临时状态枢纽,需按消息队列、缓存和原子状态三重角色设计。选型用List实现任务分发及延迟重试,Stream用于事件广播与位点回溯。go-redis/v8需配置MinIdleConns、MaxRetries及超时。数据写入应JSON序列化并带type标签、设合理TTL、将关键字段提至顶层。消费通过原子GET+DEL或processedkey

    TP8.0 高并发下库存超卖?Redis 原子递减结合数据库乐观锁控制
    TP8.0 高并发下库存超卖?Redis 原子递减结合数据库乐观锁控制

    在高并发秒杀场景下,利用Redis的减库存原子操作预扣减库存拦截超卖请求,再通过数据库乐观锁(版本号与库存校验)确保最终一致性,异常时回滚Redis库存并借助Lua脚本保证原子性,从而有效防止库存超卖。

    如何在 Go 中利用 go-redis 执行 Lua 脚本优化逻辑
    如何在 Go 中利用 go-redis 执行 Lua 脚本优化逻辑

    在Go中使用go-redis执行Lua脚本可借助原子性解决竞态问题,通过redis.Script封装脚本并自动处理SHA1缓存与重试。需注意KEYS必须为非空切片且所有键在Cluster模式下落在同一slot,ARGV以字符串传入并由tonumber转换。返回值需先检查错误再调用Val(),避免panic。

    TP6.0 基于 Redis SetNX 实现的简单互斥锁机制【并发】
    TP6.0 基于 Redis SetNX 实现的简单互斥锁机制【并发】

    先看一个典型场景:电商秒杀、库存扣减、定时任务重复调度——这些并发冲突在 TP6 应用里屡见不鲜。用 Redis 的 SETNX 做互斥锁,确实是轻量又直接的方案,但“能用”和“稳妥”之间,隔着三层硬功夫:原子加锁、身份校验、合理超时。这三条,差一条就翻车。 很多人第一次上手,直接写 SETNX 加

    TP6.0 如何处理高并发抢购?Redis 原子锁与队列削峰详解【秒杀】
    TP6.0 如何处理高并发抢购?Redis 原子锁与队列削峰详解【秒杀】

    高并发抢购中,Redis的DECR原子操作可安全扣库存;配合think-queue异步削峰,接口仅扣库存和推消息;分布式锁需用SETNXEX加唯一标识,释放时用Lua脚本校验;成功资格后须以数据库事务双写为准,失败时补回Redis库存。

    Golang 实现基于 Redis 的延时任务队列
    Golang 实现基于 Redis 的延时任务队列

    基于Redis的ZSET实现延时队列需解决并发重复消费、失败重试混乱、精度不足及内存爆炸等问题。通过Lua脚本保证取删原子性,使用毫秒级时间戳,对临时错误采用指数退避重试,永久错误记入独立哈希表,并限制最大延迟、定期清理过期任务、使用紧凑序列化格式。

    RedisInsight怎么修改Key的过期时间 Redis操作方法【步骤】
    RedisInsight怎么修改Key的过期时间 Redis操作方法【步骤】

    操作 Redis 的时候,改个 Key 的过期时间其实是个高频场景。特别是做运维排查或者临时调试那会儿,谁也不想反复切命令行窗口、背那些命令参数。好在 RedisInsight 这个图形工具把这事儿做得很顺手——三种方式任选,总有一种合你胃口。 在动手前,先确认一下 Key 当前的 TTL 状态是个

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?