Redis对象-String

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数据结构-动态字符串介绍

编码转换