redis之redisObject物件
阿新 • • 發佈:2022-12-10
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 | 字典 |