redis對象 redis中有五種常用對象 我們所說的對象的類型大多是值的類型,鍵的類型大多是字元串對象,值得類型大概有以下幾種,但是無論哪種都是基於redisObject實現的 redisObject的結構如下 type的可選值有五種.分別是 REDIS_STRING, REDIS_LIST, R ...
redis對象
redis中有五種常用對象
我們所說的對象的類型大多是值的類型,鍵的類型大多是字元串對象,值得類型大概有以下幾種,但是無論哪種都是基於redisObject實現的
redisObject的結構如下
typedef struct redisObject {
unsigned type:4; //類型 有五種,分別對應五種常見的值類型
unsigned encoding:4; // 編碼,標明底層數據結構的類型
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits decreas time). */
int refcount; //引用計數
void *ptr;// 存儲結構指針
} robj;
type的可選值有五種.分別是
REDIS_STRING,
REDIS_LIST,
REDIS_SET,
REDIS_ZSET ,
REDIS_HASH
encoding的可選值有八種
REDIS_ENCODING_INT | long型的整數 |
---|---|
REDIS_ENCODING_EMBSTR | embstr編碼的簡單動態字元串 |
REDIS_ENCODING_ROW | 簡單動態字元串 |
REDIS_ENCODING_LINKEDLIST | 雙端鏈表 |
REDIS_ENCODING_HH | 字典 |
REDIS_ENCODING_ZIPLIST | 壓縮列表 |
REDIS_ENCODING_INTSET | 整數集合 |
REDIS_ENCODING_SKIPLIST | 跳躍表 |
type和encoding共同決定了數值對象的底層結構和存儲
字元串對象
字元串對象的編碼可以是int,embstr和row
redis中的字元串對象是最常用的數據對象之一,redis中的許多鍵都是採用的字元串對象
字元串類型在redis中根據情況不同有3中情況
- 對於元素都是純數字類型的, 例如,'1','2'這種會使用int類型存儲,redis預設初始化了10000個數字對象
- 對於長度小於32的字元串類型,例如'hello',redis會使用embstr類型存儲數據
- 對於長度超過32的使用row存儲原字元
ps: embstr類型的字元串在修改後總會變成row編碼類型
列表
列表的編碼可以是linkedlist或者ziplist
- 當列表對象保存的所有字元串長度小於64位元組
- 當列表對象保存的元素數量小於512個的時候
這個時候會使用,ziplist來作為列表對象的編碼, 當不滿足這兩個條件的時候使用linkedlist
ps:這兩個值是更改的,list-max-ziplist-value 和 list-max-ziplist-entries
哈希對象
哈希對象的編碼可以是ziplist或者hashtable
字典的每一個鍵和值都是一個字元串對象
- 哈希對象保存的所有鍵和值的長度都小於64位元組
- 哈希對象保存的鍵值對數量小於512個的時候
滿足以上兩個條件,使用ziplist存儲,否則採用hashtable存儲
ps:這兩個值是更改的,hash-max-ziplist-value 和 hash-max-ziplist-entries
集合
集合對象的編碼可以是intset或者hashtable
當集合對象滿足以下兩個條件的時候採用intset
- 集合對象保存的元素都是整數
- 集合對象保存的元素數量不超過512個
不滿足以上兩個條件都是用hashtable存儲
ps: 該數值可以使用set-max-intset-entries設置
有序集合
有序集合對象的編碼可以是ziplist或者skiplist
有序集合對象跟前面的幾個對象不大一樣
typedef struct zset{
zskiplist *zsl;
dict *dict;
} zset;
zsl中保存一個跳躍表,表節點的對象即使鍵,score即是分值,該結構主要為 zrange,zrank等函數服務
同時還保存一個dict,dict中也保存有鍵和對應的分值,獲取某鍵的函數zscore使用這個結構,
同時持有字典和跳躍表是為了性能考慮
當有序集合滿足一下兩個條件時候,使用ziplist編碼
- 有序集合元素數量小於128
- 有序集合元素長度小於64
不能滿足以上兩個條件的使用skiplist
回收
redis的對象資源垃圾回收是基於引用計數
當一個對象被使用一次,引用計數增加1
當一個引用被銷毀,對象的引用計數會減1
當一個對象的引用計數為0,會被銷毀
對象共用
redis預設創建了0到9999的數字對象供1萬個
其他用到這些對象的時候可以不用創建新對象,直接使用已有的對象