底层主要结构-redisObject
redis内每个键和值都用这个对象表示,它用来封装各种底层实现
定义
typedef struct redisObject {
unsigned type: 4;
unsigned encoding: 4;
unsigned lru:LRU_BITS; //24位,记录对象最末一次被访问时间
int refcount; //引用计数
void *ptr; //指向底层实现的实例,由type和encoding共同决定用哪种底层实现
}
- type 可选结构类型
#define OBJ_STRING 0 // 字符串
#define OBJ_LIST 1 // 列表
#define OBJ_SET 2 // 集合
#define OBJ_ZSET 3 // 有序集合
#define OBJ_HASH 4 // 散列
- encoding 可选编码类型
#define OBJ_ENCODING_RAW 0
#define OBJ_ENCODING_INT 1
#define OBJ_ENCODING_HT 2
#define OBJ_ENCODING_ZIPMAP 3 /* 2.6版本后不再使用. */
#define OBJ_ENCODING_LINKEDLIST 4 /* 不再使用,旧版本2.x中String的底层之一. */
#define OBJ_ENCODING_ZIPLIST 5
#define OBJ_ENCODING_INTSET 6
#define OBJ_ENCODING_SKIPLIST 7
#define OBJ_ENCODING_EMBSTR 8
#define OBJ_ENCODING_QUICKLIST 9
#define OBJ_ENCODING_STREAM 10
- refcount 引用计数
- redis会利用此属性记录该对象是否被引用
- 创建时初始化为 1
- 共享出去时会 +1
- 消除共享或用完后 -1
- 当值降为0时,就可以直接释放占用的内存
执行命令的检查过程
- 命令 =
指令+key - 根据给定的
key,在数据库字典中找到对应的redisObject - 检查内部的
type属性,是否能执行该指令 - 检查内部的
encoding属性,选择合适的操作函数处理底层数据结构 - 返回操作结果
共享对象机制
-
redis会把
常见的值生成redisObject,然后作为共享对象,放到一个数组中,供后续引用- 【注意】只能被dict和quicklist这些会存储指针的数据结构引用
- 至于set和ziplist这种保存字符串、整数字面值的,不能用
-
常见的值包括
- 各种命令的返回值,比如OK、ERROR等
- 0、1、2、3...REDIS_SHARED_INTEGERS(默认10000)等数字
- 以上都是字符串对象,也只能共享最简单的e字符串对象