Redis基本数据结构及底层实现
redis 所有值对象在内部都定义为 redisObject
1 2 3 4 5 6 7 8 9 10 11 12 | typedef struct redisObject{ //类型 unsigned type:4; //0.5byte //编码 unsigned encoding:4; //0.5byte //指向底层数据结构的指针 void *ptr; //8byte //引用计数器 int refCount; //4byte //最后一次的访问时间 unsigned lru: //3byte } //16byte |
redis字符串对象(SDS)
1 2 3 4 5 6 7 8 | struct sdshdr{ //记录buf数组中已使用字节的长度 int len; //4byte //记录buf数组中剩余空间的长度 int free ; //4byte //字节数组,用于存储字符串 char buf[]; //'\0'占1byte }; |
intset
1 2 3 4 5 6 7 8 | typedef struct intset{ //编码方式 uint32_t encoding; //元素数量 uint32_t length; //存储元素的数组 int8_t contents[]; } |
ziplist
1 2 3 4 5 6 7 8 9 | type struct ziplist{ //整个压缩列表的字节数 uint32_t zlbytes; //记录压缩列表尾节点到头结点的字节数,直接可以求节点的地址 uint32_t zltail_offset; //记录了节点数,有多种类型,默认如下 uint16_t zllength; //节点 列表节点 entryX; |
linkedlist
1 2 3 4 5 6 7 8 9 | type struct list{ //表头节点 listNode *head; //表尾节点 listNode *tail; //包含的节点总数 unsigned long len; //一些操作函数 dup free match... }; |
hashtable
1 2 3 4 5 6 7 8 9 10 | typedef struct dictht{ //哈希表数组 dictEntry **table; //哈希表大小 unsigned long size; //哈希表掩码,总是等于size-1,存储时计算索引值 unsigned long sizemask; //已有元素数量 unsigned long used; } |
skiplist
typedef struct zskiplistNode { //层 struct zskiplistLevel { //前进指针 struct zskiplistNode *forward; //跨度 unsigned int span; } level[]; //后退指针 struct zskiplistNode *backward; //分值 double score; //成员对象 robj *obj; } zskiplistNode; typedef struct zskiplist { //头结点 zskiplistNode *head; //尾节点 zskiplistNode *tail; //当前最大层高 int maxLevel; //跳表长度 int length; //跳表中的所有键值对 map<String,zskiplistNode*> ht; }
一、字符串(string 最大512M)
内部编码:(查看内部编码命令 object encoding 键值)
int:8个字节的长整形
embstr:小于等于某个值(39个)字节的字符串
raw:大于某个值(39个)字节的字符串
二、哈希(hash)
内部编码:
ziplist:当元素个数小于某个值(hash-max-ziplist-entries 默认512),同时每个元素占用内存都小于某个值(hash-max-ziplist-value 默认64字节)redis使用ziplist节省内存
hashtable:不满足ziplist的条件就用hashtable
三、列表(list)
内部编码:
ziplist:当元素个数小于某个值(list-max-ziplist-entries 默认512),同时每个元素占用内存都小于某个值(list-max-ziplist-value 默认64字节)redis使用ziplist节省内存
linkedlist:不满足ziplist的条件就用hashtable
四、集合(set)
内部编码:
intset:当集合中的元素都是整数且元素个数小于某个值(set-max-intset-entries 默认512)时 ,使用intset节省内存
hashtable:不满足intset的条件就用hashtable
五、有序集合(zset)
内部编码:
ziplist:当元素个数小于某个值(zset-max-ziplist-entries 默认128),同时每个元素占用内存都小于某个值(zset-max-ziplist-value 默认64字节)redis使用ziplist节省内存
skiplist:不满足ziplist的条件就用skiplist
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!