【Redis】Redis 底层的数据结构(结合源码)

Redis 底层数据结构主要包括:

  1. 字符串(String)
  2. 字典(Hash)
  3. 链表(List)
  4. 集合(Set)
  5. 有序集合(Sorted Set,或称为 zset)

这些数据结构在 Redis 中都是基于以下两种底层实现:

  1. 静态字符串(Simple dynamic string, SDS):一种动态字符串实现,用于存储字符串数据。
  2. 跳跃表(Skip list):一种复合的数据结构,可以在对数平均时间内执行排序和搜索操作,Redis 的 zset 就是基于此实现。

以下是 Redis 中字符串数据结构的简单实现:




// 静态字符串定义
struct sdshdr {
    long len; // 记录buf中已使用的字节数
    long free; // 记录buf中未使用的字节数
    char buf[]; // 字符串数据存储区
};
 
// 字符串对象定义
typedef struct redisObject {
    unsigned type:4; // 对象类型
    unsigned encoding:4; // 对象编码
    unsigned lru:LRU_BITS; // 对象最后一次被访问的时间
    int refcount; // 对象引用计数
    void *ptr; // 指向实际的数据
} robj;
 
// 创建一个字符串对象
robj *createStringObject(const char *ptr, size_t len) {
    // 为sdshdr和字符串数据分配空间
    robj *o = zmalloc(sizeof(robj)+sizeof(struct sdshdr)+len+1);
    struct sdshdr *sh = (void*)(o+1);
 
    // 初始化robj
    o->type = REDIS_STRING;
    o->encoding = REDIS_ENCODING_RAW;
    o->ptr = sh+1; // ptr指向数据区
    o->refcount = 1;
 
    // 初始化sdshdr
    sh->len = len;
    sh->free = 0;
    if (ptr) {
        memcpy(sh->buf, ptr, len);
    } else {
        memset(sh->buf, '', len);
    }
    sh->buf[len] = '\0';
 
    return o;
}

以上代码仅为示例,实际的 Redis 源码会更加复杂,包含对象共享、内存分配策略等多种优化措施。

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日