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
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
指向的地址。