1. 程式人生 > 其它 >redis之redisObject物件

redis之redisObject物件

redisObject物件

無論什麼資料型別,redis都是以key-value形式儲存,並且所有的key都是字串
redis每儲存一條資料,都會生成一個redisObject物件,通過redisObject物件來表示儲存的資料

redisObject物件是聯結外部資料型別和redis底層資料結構的橋樑,其實是指向底層資料結構

redisObject物件至少包括:
1) 用來描述具體資料的型別
2) 儲存的具體資料

1 redisObject物件的底層結構

結構如下:

typedef struct redisObject {
  unsigned type:4;
  unsigned encoding:4;
  unsigned lru:LRU_BITS;
  int refcount;
  void *ptr;
} robj;

其中:

type:資料型別,佔4bit,目前包括:REDIS_STRING(字串)、REDIS_LIST(列表)、REDIS_HASH(雜湊)、REDIS_SET(集合)、REDIS_ZSET(有序集合)

encoding:儲存的具體資料對應的redis底層編碼,佔4bit

lru:物件最後一次被訪問的時間,用於redis記憶體回收演算法淘汰key

refcount:引用計數,允許redisObject物件在某些情況下被共享

ptr:指向資料的指標,實際指向資料型別對應的底層資料結構

2 使用redisObjec物件的好處 

 1) 執行redis命令時,可以通過redisObject 的type和encoding屬性來確定是否可以執行相應的命令,不用等操作具體的資料時才發現命令不可執行
 2) 同一資料型別可以使用不同的底層編碼,優化不同場景下的使用效率和節省記憶體
 3) 支援共享和引用計數。當物件被共享時,只佔用一份記憶體拷貝,節省記憶體
 4) 根據lru屬性並結合redis記憶體回收演算法淘汰長時間未使用的key

3 type,資料型別, encoding和底層資料結構的關係

相同的type,可能對應不同的encoding:同一個資料型別,redis使用了不同的底層資料結構,導致在記憶體佔用和查詢效能上會有所不同

redis中每種資料型別都會有至少對應2種底層資料結構

type redis資料型別 編碼 encoding 底層資料結構
REDIS_STRING String(字串) int REDIS_ENCODING_INT long型整數的簡單動態字串
REDIS_STRING String(字串) embstr REDIS_ENCODING_EMBSTR embstr編碼的簡單動態字串
REDIS_STRING String(字串) raw REDIS_ENCODING_RAW 簡單動態字串
REDIS_LIST List(列表) ziplist REDIS_ENCODING_ZIPLIST 壓縮列表
REDIS_LIST List(列表) linkedlist REDIS_ENCODING_LINKEDLIST 雙向連結串列
REDIS_SET Set(集合) intset REDIS_ENCODING_INTSET 整數集合
REDIS_SET Set(集合) hashtable REDIS_ENCODING_HT 字典
REDIS_ZSET Sorted Set(有序集合) ziplist REDIS_ENCODING_ZIPLIST 壓縮列表
REDIS_ZSET Sorted Set(有序集合) skiplist REDIS_ENCODING_SKIPLIST 跳錶+字典
REDIS_HASH Hash(雜湊) ziplist REDIS_ENCODING_ZIPLIST 壓縮列表
REDIS_HASH Hash(雜湊) hashtable REDIS_ENCODING_HT 字典