redisObject redis 是 key-value 存儲系統,其中key類型一般為字元串,而 value 類型則為 redis 對象(redisObject)。Redis 對象可以綁定各種類型的數據,譬如 string、list 和set。因此他能很好的將屬性和數據分離開。 typedef ...
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
執行具體的數據。
redisObject 數據的屬性
redis.h
中定義了 struct redisObject
,它是一個簡單優秀的數據結構,因為在 redisObject
中數據屬性和數據分開來了,其中,數據屬性包括數據類型,存儲編碼方式,淘汰時鐘,引用計數。
數據類型
標記了 Redis 對象綁定的是什麼類型的數據,有下麵幾種可能的值;
字元串
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。
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
指向的地址。