(4) “dictEntry”中的"key"由sds(简单动态字符串)结构组成 。redis根据数据的长度,定义了不同类型的sds结构 。例如:sdshdr8,sdshdr16,sdshdr32,sdshdr64;这样的结构定义,既节省了空间,也解决了二进制安全(例如C语言的‘’)和缓冲区溢出(通过alloc-len可计算剩余空间)等问题 。
//SDS.Hstruct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* used */uint8_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];};struct __attribute__ ((__packed__)) sdshdr16 {uint16_t len; /* used */uint16_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];};
(5) redis有“STRING, LIST,SET,ZSET,HASH,MODULE,STREAM”七种数据类型;有“sds, quicklist,ziplist,dict,zskiplist,stream”七种底层数据结构;每种数据类型根据存储数据的大?。?嗌俚?,分别由不同的底层数据结构实现 。例如list数据类型,由“quicklist,ziplist”分别实现;HASH数据类型,由“dict,ziplist”分别实现 。
(6) dictEntry”中的"*val"指向redisObject"结构,此结构中“redisObject->type”存储的是数据类型;“redisObject->encoding”存储的是底层的数据结构类型;redisObject->ptr”存储具体的数据;相应的实现在“object.c”中 。
//object.crobj *createQuicklistObject(void) {quicklist *l = quicklistCreate();robj *o = createObject(OBJ_LIST,l);o->encoding = OBJ_ENCODING_QUICKLIST;return o;}robj *createZiplistObject(void) {unsigned char *zl = ziplistNew();robj *o = createObject(OBJ_LIST,zl);o->encoding = OBJ_ENCODING_ZIPLIST;return o;}robj *createSetObject(void) {dict *d = dictCreate(&setDictType,NULL);robj *o = createObject(OBJ_SET,d);o->encoding = OBJ_ENCODING_HT;return o;}robj *createIntsetObject(void) {intset *is = intsetNew();robj *o = createObject(OBJ_SET,is);o->encoding = OBJ_ENCODING_INTSET;return o;}robj *createHashObject(void) {unsigned char *zl = ziplistNew();robj *o = createObject(OBJ_HASH, zl);o->encoding = OBJ_ENCODING_ZIPLIST;return o;}
Part 03、 源码调试 3.1 入口正如所有的C代码一样,入口是service.c中的main函数 。
文章插图
图片
3.2 redis命令入口所有的redis命令定义在“redisCommandTable”数组中 , 类型为"redisCommand",通过函数指针的方式调用 。例如下图中的Get和Set命令 。
文章插图
图片
文章插图
图片
Part 04、 总结 以上分别从环境搭建,数据库的结构组织关系和源码调试进行了介绍,如果你对redis源代码感兴趣,行动起来吧!
【浅析Redis数据结构】
推荐阅读
- Redis数据类型与应用场景
- 使用Docker Compose搭建高可用Redis集群
- 如何进行Redis性能优化?这一篇就够了
- Python之Redis操作
- Redis管道技术瞬间提升系统性能,速度翻倍!
- Redis 的主库挂了,如何不间断服务?
- Redis中万金油的String,为什么不好用了?
- 无敌到寂寞!Redis进军磁盘存储!
- 直接上最优解:如何保障MySQL和Redis的数据一致性?
- 浅谈HBase数据结构和系统架构