一、RedisObject
1.1、Redis数据存储
1.2、RedisObject的数据结构
redis的value都封装在redisObject中
redisObject的底层实现:
redisObject的数据结构如下:
server.h
typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or * LFU data (least significant 8 bits frequency * and most significant 16 bits access time). */ int refcount; void *ptr; } robj;
-
type:4bit,表示value的类型 obj_string:字符串 0 obj_list:列表 1 obj_set :集合 2 obj_zset : 有序集合 3 obj_hash: 散列 4 obj_module: 模块 5 obj_stream 流 6
-
encoding:4bit,表示value内部存储的编码 10大编码 String: raw(0)、int(1)、embstr(8) hash: ht(2)、zipmap(3)、ziplist(5) list: quicklist(9) zet: intset(6)、ziplist(5) zset: skiplist(7) stream: listpack(10)
-
lru(lfu):24bit,lru表示最后一次访问时间,lfu高16位表示分钟级别的访问时间,低8位表示访问频率
-
refcount:被引用的计数 共享对象:共享值相同的对象
共享对象一般是整数,不做字符串的
整数判断相同 判断值 : O(1)
字符串判断相同 判断内容 O(n)
-
ptr:指向具体数据的指针
1.3、API解析
object.c
createObject
创建对象:
-
申请内存
-
初始化属性
-
如果内存策略是lfu,则赋值lru属性为unix时间取低16位
-
否则取unix秒级时间戳
-
返回对象指针