redis数据结构

SDS的定义

每个sds.h/sdshdr结构表示一个SDS值:

struct sdshdr {
// 记录buf数组中已使用字节的数量
// 等于SDS所保存字符串的长度
int len;

// 记录buf数组中未使用字节的数量
int free;

// 字节数组,用于保存字符串
char buf[];
};

优点:

  • 常数复杂度获取字符串长度
  • 杜绝缓冲区溢出
  • 减少修改字符串时带来的内存重分配次数
  • 实现了空间预分配和惰性空间释放
  • 二进制安全
  • 兼容部分C字符串函数

链表和链表节点的实现

每个链表节点使用一个adlist.h/listNode结构来表示:

typedef struct listNode {
// 前置节点
struct listNode *prev;
// 后置节点
struct listNode *next;
// 节点的值
void *value;
} listNode;

使用adlist.h/list来持有链表:

typedef struct list {
// 表头节点
listNode *head;
// 表尾结点
listNode *tail;
// 链表所包含的节点数量
unsigned long len;
// 节点值复制函数
void * ( *dup)(void *ptr);
// 节点释放函数
void (* free)(void *ptr);
// 节点值对比函数
int (*match)(void *ptr, void *key);
} list;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述redis是目前最常用的高效缓存系统,在互联网行业中使用广泛;因此打算了解下其内部采用的数据结构; redis...
    allanYan阅读 2,944评论 0 0
  • tips:本文参照《redis设计与实现》、《数据结构与算法》、redis源码 链表提供了高效的节点重排能力,以及...
    TOUCH_d36e阅读 3,146评论 0 0
  • 应用层: String——字符串 Hash——字典 List——列表 Set——集合 Sorted Set——有序...
    vivi_wong阅读 4,695评论 0 0
  • 1. SDS简介 Redis中使用的字符串均为『简单动态字符串』(Simple Dynamic String),简...
    大闲人柴毛毛阅读 3,283评论 0 0
  • 一谨以此篇献给深山沟的母亲们 一天,朋友绐我讲了一个故事。 这些天,我都被这个故事感动着; 我的思想感情的潮水,在...
    黑土地_6345阅读 3,696评论 21 28