Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

底层主要结构-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字符串对象