【Java】Redis五大核心数据结构底层原理解析

Redis作为高性能内存数据库的核心竞争力,不仅在于其丰富的数据结构类型,更在于其底层精妙的设计与实现。本文将深入剖析String、List、Hash、Set、Sorted Set五大核心数据结构的实现原理,结合Redis 7.0源码解析其设计哲学。

String(动态字符串)

底层结构:SDS(Simple Dynamic String)

java 复制代码
struct sdshdr {
    int len;        // 已用长度
    int alloc;      // 总分配长度
    unsigned char flags; // 类型标识
    char buf[];     // 字节数组
};
  1. 空间预分配:当SDS需要扩容时,会额外分配未使用空间(<1MB时翻倍,≥1MB时每次+1MB)
  2. 惰性释放:缩短字符串时不立即回收内存,通过len字段标记可用空间
  3. 二进制安全:通过len字段而非空字符判断结束,可存储任意二进制数据

场景特征:

  1. 计数器(INCR/DECR原子操作)
  2. 缓存对象(JSON序列化存储)
  3. 分布式锁(SETNX命令)

List(链表)

底层结构:Quicklist(3.2版本后)

java 复制代码
typedef struct quicklist {
    quicklistNode *head;
    quicklistNode *tail;
    unsigned long count;     // 元素总数
    unsigned long len;       // quicklistNode数量
    int fill : QL_FILL_BITS; // 单个ziplist最大容量
    unsigned int compress : QL_COMP_BITS; // LZF压缩深度
} quicklist;

复合结构:

  1. 宏观:双向链表(支持前后遍历)
  2. 微观:ziplist(内存紧凑结构)
  3. 压缩机制:通过LZF算法压缩中间节点(配置list-compress-depth)

性能优化:

  1. 元素≤48字节且列表长度≤512时使用ziplist(通过list-max-ziplist-size配置)
  2. 通过fill参数控制单个ziplist大小(默认8KB)

Hash(字典)

底层编码:

  1. ziplist(默认):
  2. 存储格式:field1, value1, field2, value2,...
  3. 适用条件:field数量≤512且value大小≤64字节(hash-max-ziplist-entries/values)
  4. hashtable:
  5. 使用dictht结构实现
  6. 渐进式rehash:维护两个哈希表,逐步迁移数据

源码结构:

java 复制代码
typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];    // 双哈希表
    long rehashidx;  // rehash进度
    int iterators;   // 迭代器数量
} dict;

最佳实践:

  1. 对象属性存储(用户信息)
  2. 配置参数聚合存储
  3. 使用HSCAN避免大Hash阻塞

Set(集合)

底层实现:

  1. intset:
  2. 有序整数数组
  3. 条件:元素均为整数且数量≤512(set-max-intset-entries)
  4. hashtable:
  5. 字典实现(value=null)

特殊操作优化:

  1. SINTERSTORE使用位图算法优化交集计算
  2. SPOP使用随机探针+删除策略
  3. SISMEMBER时间复杂度O(1)

应用场景:

  1. 标签系统
  2. 唯一性校验
  3. 好友关系(并集/差集运算)

Sorted Set(有序集合)

底层实现:

  1. ziplist(默认):
  2. 存储格式:member1, score1, member2, score2,...
  3. 适用条件:元素数量≤128且member长度≤64(zset-max-ziplist-entries/value)
  4. 跳表+字典:
  5. skiplist:实现范围查询(ZRANGE)
  6. dict:实现O(1)复杂度元素查找

跳表结构:

java 复制代码
typedef struct zskiplistNode {
    sds ele;
    double score;
    struct zskiplistNode *backward;
    struct zskiplistLevel {
        struct zskiplistNode *forward;
        unsigned long span;
    } level[];
} zskiplistNode;

设计亮点:

  1. 随机化层高(1/4概率升级)
  2. 范围查询性能媲美平衡树
  3. 支持相同score的字典序排序

数据结构选择策略

调优建议:

  1. 监控内存碎片率(mem_fragmentation_ratio)
  2. 合理设置ziplist转换阈值
  3. 对大Key进行分片处理(如user:1000:info拆分为多字段)
  4. 使用SCAN系列命令代替KEYS
相关推荐
2301_780789662 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
m0_639906943 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
学长毕设3 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
步行cgn4 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川4 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵4 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David4 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1005 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin5 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质6 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring