redis是C语言编写的,内部用到的主要数据结构如下:
简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合等待。
redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这
个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到
了至少一种数据结构。
通过这五种不同类型的对象,redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行
给定的命令。使用对象的另一个好处是,我们可以针对不同的使用场景,为对象设置多种不同的数据结构实现
,从而优化对象在不同场景下的使用效率。
redis的对象带有访问时间记录信息,该信息可以用于计算数据库键的空转时长,在服务器启用了max-
memory功能的情况下,空转时长较大的那些键可能会优先被服务器删除。
结构
1 /* A redis object, that is a type able to hold a string / list / set */ 2 3 /* The actual Redis Object */ 4 /* 5 * Redis 对象 6 */ 7 #define REDIS_LRU_BITS 24 8 #define REDIS_LRU_CLOCK_MAX ((1<<REDIS_LRU_BITS)-1) /* Max value of obj->lru */ 9 #define REDIS_LRU_CLOCK_RESOLUTION 1000 /* LRU clock resolution in ms */ 10 typedef struct redisObject { 11 12 // 类型 13 unsigned type:4; 14 15 // 编码 16 unsigned encoding:4; 17 18 // 对象最后一次被访问的时间 19 unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ 20 21 // 引用计数 22 int refcount; 23 24 // 指向实际值的指针 25 void *ptr; 26 27 } robj;