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 執行具體的數據。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM