redis 存儲之 redisObject

redisObject

redis 是 key-value 存儲系統,其中key類型通常爲字符串,而 value 類型則爲 redis 對象(redisObject)。Redis 對象能夠綁定各類類型的數據,譬如 string、list 和set。所以他能很好的將屬性和數據分離開。程序員

typedef struct redisObject {
    // 剛恰好32 bits
    // 對象的類型,字符串/列表/集合/哈希表
    unsigned type:4;
    
    // 未使用的兩個位
    unsigned notused:2; /* Not used */
  
    // 編碼的方式,Redis 爲了節省空間,提供多種方式來保存一個數據
    // 譬如:「123456789」 會被存儲爲整數123456789
    unsigned encoding:4;
  
    // 當內存緊張,淘汰數據的時候用到
    unsigned lru:22; /* lru time (relative to server.lruclock) */
  
    // 引用計數
    int refcount;
  
    // 數據指針
    void *ptr;
} robj;

其中,void *ptr 執行具體的數據。redis

redisObject 數據的屬性

redis.h 中定義了 struct redisObject,它是一個簡單優秀的數據結構,由於在 redisObject 中數據屬性和數據分開來了,其中,數據屬性包括數據類型,存儲編碼方式,淘汰時鐘,引用計數。數據結構

數據類型

標記了 Redis 對象綁定的是什麼類型的數據,有下面幾種可能的值;多線程

字符串memcached

define REDIS_STRING 0

列表函數

define REDIS_LIST 1

集合編碼

define REDIS_SET 2

有序集合線程

define REDIS_ZSET 3

哈希指針

define REDIS_HASH 4

存儲編碼方式

存儲編碼方式,一個數據,能夠以多種方式存儲。譬如,數據類型爲 REDIS_SET 的數據編碼方式可能爲 REDIS_ENCODING_HT,也可能爲 REDIS_ENCODING_INTSET。code

define REDIS_ENCODING_RAW 0 /* Raw representation */

define REDIS_ENCODING_INT 1 /* Encoded as integer */

define REDIS_ENCODING_HT 2 /* Encoded as hash table */

define REDIS_ENCODING_ZIPMAP 3 /* Encoded as zipmap */

define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */

define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist */

define REDIS_ENCODING_INTSET 6 /* Encoded as intset */

define REDIS_ENCODING_SKIPLIST 7 /* Encoded as skiplist */

淘汰時鐘

Redis 對數據集佔用內存的大小有實時的計算,當超出限額時,會淘汰超時的數據。

引用計數

一個 Redis 對象可能被多個指針引用。當須要增長或者減小引用的時候,必須調用相應的函數,程序員必須遵照這一準則。由於Redis 是單進程單線程工做的,因此增長/減小引用的操做沒必要保證原子性,這在 memcache 中是作不到的(memcached 是多線程的工做模式,須要作到互斥)。

ptr

數據指針,真正的數據 保存在 ptr指向的地址。

相關文章
相關標籤/搜索