Redis 實現了一套簡單的類型系統,其對象的數據結構和相關函數聲明於頭文件 server.h,實現於 object.c

數據結構

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */
    int refcount;
    void *ptr;
} robj;
  • type: 對象的類型。有如下幾種:

    #define OBJ_STRING 0
    #define OBJ_LIST 1
    #define OBJ_SET 2
    #define OBJ_ZSET 3
    #define OBJ_HASH 4
    #define OBJ_MODULE 5
    

    前幾種是 Redis 中的基本類型,而最後的 OBJ_MODULE 表示這個對象是由擴展模塊創建和管理的。

  • encoding: 類型的「編碼」,實際上可看做是類型的不同實現。比如 OBJ_STRING 類型有 OBJ_ENCODING_RAW, OBJ_ENCODING_INTOBJ_ENCODING_EMBSTR 幾種編碼方式。
  • lru: LRU 時間戳
  • refcount: 引用記數,用於 GC
  • ptr: 對象的實際數據。所以這個 redisObject/robj 的聲明本質是對象頭的聲明。

函數筆記

  • 對象的默認編碼為 OBJ_ENCODING_RAW
  • 可以通過 makeObjectShared(robj *o) 標記一個對象為共享對象,使其引用記數恒定,不會被 GC。小的整型對象即是通過這種方式共享的。
  • 可用 OBJECT 命令查看對象的 refcount, encoding 和 idletime 等信息