Redis对象结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| typedef struct redisObject {
// 类型 unsigned type:4;
// 编码 unsigned encoding:4;
/* 除了可以被 OBJECT IDLETIME 命令打印出来之外, 键的空转时长还有另外一项作用: 如果服务器打开了 maxmemory 选项, 并且服务器 用于回收内存的算法为 volatile-lru 或者 allkeys-lru , 那么当服务器占用的内存数超过了 maxmemory 选项所设置的上限值时, 空转 时长较高的那部分键会优先被服务器释放, 从而回收内存。 */ // LRU 时间(相对于 server.lruclock) OBJECT IDLETIME 命令可以打印出给定键的空转时长, 这一空转时长就是通过将当前时间减去键的值对象的 lru 时间计算得出的 // 对象最后一次被访问的时间 // 该属性记录了对象最后一次被命令程序访问的时间: 10s统计一次 unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ //每次访问KV,只要没有正在进行fork rdb或者aof操作,就会更新,见lookupKey
// 引用计数 int refcount;
// 指向底层数据结构的实现 void *ptr;
} robj;
|
其中type代表的是当前redisObject是什么类型,包含以下类型:
- REDIS_STRING 字符串对象
- REDIS_LIST 列表对象
- REDIS_HASH 哈希对象
- REDIS_SET 集合对象
- REDIS_ZSET 有序集合对象
encoding 属性记录了对象所使用的编码, 也即是说这个对象使用了什么数据结构作为对象的底层实现,比如REDIS_ENCODING_INT,REDIS_ENCODING_EMBSTR,REDIS_ENCODING_RAW,REDIS_ENCODING_HT(上篇文章写到的字典)
refcount 被引用的次数,redis中的对象是可以被共享的,这里的refcount是为了记录被共享次数,以方便垃圾回收
ptr指向底层数据结构的实现,这些数据结构由encoding来决定
String对象编码类型
Redis数据结构-动态字符串介绍
编码转换