# Redis数据结构清单

Posted on 2025-08-31 02:24  吾以观复  阅读(3)  评论(0)    收藏  举报

关联知识库:# Redis数据结构清单

Redis数据结构清单


导读:思维路线

本文将从Redis版本演进的角度,展示数据结构如何随着版本迭代逐步增加和完善。通过理解每个版本的设计哲学和技术实现,我们可以更好地掌握Redis数据结构的演进历程和设计精髓。

文章主要内容结构

  1. ** 历史背景** - Redis从2009年1.0版本到现在的演进历程
  2. ** 设计哲学** - Redis的三大核心思想:简单即美、性能优先、数据结构即语言
  3. ⚙️ 技术实现 - 5种基础数据结构的深度解析(String、Hash、List、Set、ZSet)
  4. ** 特殊数据结构** - 版本演进中的功能扩展(Bitmap、HyperLogLog、Streams、Bitfield)
  5. ** 总结** - Redis数据结构的演进哲学和设计精髓

学习路径建议

  • 初学者:从原始笔记草稿开始,快速了解核心概念
  • 进阶者:重点学习设计哲学和技术实现部分
  • 实践者:深入特殊数据结构,了解版本演进背景
  • 架构师:理解设计哲学,掌握演进规律

历史背景:Redis的诞生与演进

⏰ 2009年:Redis 1.0 - 从简单缓存开始

  • 诞生背景:Salvatore Sanfilippo为了解决LOLO(Live Object Loader)的性能问题
  • 初始定位:简单的内存键值存储,替代Memcached
  • 核心思想:用内存换取性能,用简单换取效率

️ 早期版本的核心数据结构

Redis 1.0只包含最基础的5种数据结构:

  • String:最基础的数据类型
  • Hash:结构化数据存储
  • List:队列与栈的实现
  • Set:无序集合
  • ZSet:有序集合

设计哲学:Redis的核心思想

哲学1:简单即美

"Redis is not a complex system. It's a simple system that does one thing well."

  • 单一职责:每个数据结构专注解决特定问题
  • 接口简洁:命令命名直观,学习成本低
  • 实现透明:内部实现细节对用户隐藏

⚡ 哲学2:性能优先

  • 内存操作:所有数据操作都在内存中完成
  • 零拷贝:尽可能减少内存拷贝和分配
  • 批量操作:支持pipeline和multi-exec

哲学3:数据结构即语言

  • 类型系统:数据结构本身就是编程语言
  • 原子操作:每个操作都是原子的,无需额外锁机制
  • 组合能力:通过数据结构组合实现复杂功能

⚙️ 技术实现:5种基础数据结构深度解析

1. String - 最基础的数据类型

设计哲学

  • 万物皆字符串:所有数据最终都可以表示为字符串
  • 简单高效:最直接的内存表示方式

技术实现

// Redis 3.2+ 的字符串优化
struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len;        // 字符串长度
    uint8_t alloc;      // 分配的空间
    unsigned char flags; // 类型标识
    char buf[];         // 实际字符串内容
};

内存优化策略

  • embstr编码:短字符串(≤44字节)直接嵌入对象头
  • raw编码:长字符串使用动态字符串结构
  • int编码:数字字符串直接存储为整数

应用场景

  • 缓存键值:用户信息、配置参数
  • 计数器:访问统计、限流计数
  • 分布式锁:SET key value NX EX seconds

️ 2. Hash - 结构化数据存储

设计哲学

  • 字段级操作:支持单个字段的读写,避免全量传输
  • 内存友好:相比JSON字符串,内存占用更少

技术实现

// Hash表结构
typedef struct dict {
    dictType *type;        // 类型特定函数
    void *privdata;        // 私有数据
    dictht ht[2];         // 两个哈希表(用于rehash)
    long rehashidx;        // rehash索引
    unsigned long iterators; // 迭代器数量
} dict;

内存优化

  • ziplist编码:小hash使用压缩列表,节省内存
  • hashtable编码:大hash使用哈希表,保证性能

应用场景

  • 用户信息:用户ID ->
  • 商品属性:商品ID ->
  • 配置管理:应用配置的键值对存储

3. List - 队列与栈的实现

设计哲学

  • 双向链表:支持两端操作,实现队列和栈
  • 阻塞操作:支持阻塞式读取,实现消息队列

技术实现

// 快速列表结构(Redis 3.2+)
typedef struct quicklist {
    quicklistNode *head;     // 头节点
    quicklistNode *tail;     // 尾节点
    unsigned long count;     // 总节点数
    unsigned long len;       // 节点数量
    int fill : 16;           // 每个节点的最大容量
    unsigned int compress : 16; // 压缩深度
} quicklist;

内存优化

  • ziplist节点:小列表使用压缩列表节点
  • 普通节点:大列表使用普通链表节点
  • 压缩策略:中间节点可压缩,节省内存

应用场景

  • 消息队列:LPUSH + BRPOP实现生产者消费者
  • 最新动态:用户动态列表、新闻feed
  • 任务队列:异步任务处理队列

4. Set - 无序集合

设计哲学

  • 去重特性:天然支持去重,无需额外逻辑
  • 集合运算:支持并集、交集、差集等数学运算

技术实现

// 整数集合(小set优化)
typedef struct intset {
    uint32_t encoding;      // 编码方式
    uint32_t length;        // 元素数量
    int8_t contents[];      // 元素数组
} intset;

// 哈希表(大set)
typedef struct dict {
    // ... 同hash实现
} dict;

内存优化

  • intset编码:纯整数set使用整数集合,节省内存
  • hashtable编码:混合类型使用哈希表

应用场景

  • 用户标签:用户ID ->
  • 好友关系:用户的好友ID集合
  • 权限控制:用户的权限集合

5. ZSet - 有序集合

设计哲学

  • 排序能力:支持按分数排序,实现排行榜
  • 范围查询:支持分数范围查询,实现分页

技术实现

// 跳表结构
typedef struct zskiplistNode {
    struct zskiplistNode *backward;  // 后退指针
    double score;                     // 分数
    robj *obj;                       // 成员对象
    struct zskiplistLevel {          // 层
        struct zskiplistNode *forward; // 前进指针
        unsigned int span;              // 跨度
    } level[];
} zskiplistNode;

跳表优势

  • 平均复杂度:查找、插入、删除都是O(log N)
  • 实现简单:比红黑树更容易实现和维护
  • 范围查询:支持高效的范围查询操作

应用场景

  • 排行榜系统:游戏积分榜、商品销量榜
  • 时间序列:按时间排序的事件记录
  • 权重排序:按优先级排序的任务队列

特殊数据结构:版本演进中的功能扩展

️ Redis 2.2+:Bitmap - 位图优化

版本背景

  • 引入时间:Redis 2.2版本
  • 设计动机:解决大量布尔值存储的内存浪费问题
  • 应用需求:用户签到、在线状态等场景

设计哲学

"节衣缩食" - 用最小的存储空间表示布尔值

技术实现

  • 位操作:直接操作内存中的位
  • 批量操作:支持批量位操作,性能极高

应用场景

  • 用户签到:365天签到记录只需46字节
  • 在线状态:百万用户在线状态只需125KB
  • 布隆过滤器:实现高效的集合成员判断

Redis 3.2+:HyperLogLog - 基数统计

版本背景

  • 引入时间:Redis 3.2版本
  • 设计动机:解决大数据量基数统计的内存占用问题
  • 技术来源:基于Philippe Flajolet的HyperLogLog算法

设计哲学

"不精确但足够准确" - 用极小的存储空间统计大量数据的基数

技术实现

  • 概率算法:基于概率统计,误差率约0.81%
  • 分桶策略:将数据分到多个桶中,减少冲突

应用场景

  • UV统计:统计独立访客数量
  • 搜索统计:统计搜索关键词数量
  • 社交统计:统计用户关注数量

Redis 5.0+:Streams - 消息流

版本背景

  • 引入时间:Redis 5.0版本
  • 设计动机:Redis生态需要轻量级消息队列功能
  • 竞品分析:比Kafka更轻量,适合Redis生态

设计哲学

"轻量级消息队列" - 比Kafka更轻量,适合Redis生态

技术实现

  • ID生成:基于时间戳和序列号的唯一ID
  • 消费者组:支持消费者组模式,实现负载均衡
  • 持久化:支持AOF持久化,保证消息不丢失

应用场景

  • 实时数据流:传感器数据、日志流
  • 事件溯源:用户行为事件记录
  • 消息队列:轻量级任务队列

Redis 6.0+:Bitfield - 位域操作

版本背景

  • 引入时间:Redis 6.0版本
  • 设计动机:支持更复杂的位操作,如字节运算
  • 技术挑战:维护复杂,使用门槛较高

设计哲学

"支持字节运算" - 提供更底层的位操作能力

技术实现

  • 字节操作:支持get、set、incrby等字节级操作
  • 溢出处理:支持saturating和wrapping溢出处理
  • 类型支持:支持有符号和无符号整数

应用场景

  • 位图压缩:压缩存储多个小整数
  • 状态标志:存储多个布尔状态标志
  • 计数器组:多个小计数器的紧凑存储

总结:Redis数据结构的演进哲学

Redis通过渐进式功能扩展,实现了从简单缓存到功能丰富的数据平台的演进:

演进特点

  1. 基础先行:先完善5种基础数据结构,确保核心功能稳定
  2. 需求驱动:根据实际应用场景逐步添加特殊数据结构
  3. 向后兼容:新功能不影响现有功能,平滑升级
  4. 性能优先:每个新数据结构都经过性能优化

设计精髓

  • 简单性:每个数据结构都有明确的用途和简洁的接口
  • 性能性:所有数据结构都经过内存和性能优化
  • 扩展性:通过数据结构组合实现复杂功能
  • 生态性:逐步构建完整的Redis生态系统

理解Redis数据结构的演进历程,我们就能更好地在实际项目中选择合适的结构,并期待未来版本带来的新功能。


参考资料:Redis官方文档、Redis设计与实现、Redis开发与运维