Redis RDB檔案儲存的是位元據,結構包括5部分:
REDIS | db_version | databases | EOF | check_sum
db_version長度為4個位元組,它的值是一個字串表示的整數,記錄RDB檔案的版本號碼。
databases記錄資料庫執行個體,和各個資料庫執行個體的索引值對資料,如果redis-server中所有db都為空白,那這個值也為空白,長度為0位元組。
EOF常量長度為1位元組,標誌著RDB檔案本文內容結束。
check_sum是一個8位元組長的不帶正負號的整數,儲存著一個校正和,這個校正和是程式通過對REDIS、db_version、databases、EOF四個部分內容計算而來。Redis在載入RDB檔案時,會將載入資料的檢驗和與該值對比,以此來檢查RDB檔案是否出錯或損壞。
1.databases
每個非空資料庫在RDB檔案中的都儲存為SELECTDB、db_number、key_value_pairs三個部分。
SELECTDB | db_number | key_value_pairs
SELECTDB常量長度為1位元組,標識後面的資料庫號碼。
db_number儲存資料庫號碼,根據號碼大小不同,長度為1位元組、2位元組或5位元組。當程式讀入db_number部分後,伺服器啊會調用SELECT命令,根據讀入的資料庫號碼進行資料庫切換。
key_value_pairs儲存了資料庫中所有索引值對資料,如果索引值對帶有到期時間,那麼到期時間也會和索引值對儲存在一起。
2.key_value_pairs
不帶到期時間的索引值對結構
TYPE | key | value
帶到期時間的索引值對結構
EXPIRETIME_MS | ms | TYPE | key | value
其中,TYPE記錄value的類型,是以下常量中任意一個:
REDIS_RDB_TYPE_STRING
REDIS_RDB_TYPE_LIST
REDIS_RDB_TYPE_SET
REDIS_RDB_TYPE_ZSET
REDIS_RDB_TYPE_HASH
REDIS_RDB_TYPE_LIST_ZIPLIST
REDIS_RDB_TYPE_SET_INSERT
REDIS_RDB_TYPE_ZSET_ZIPLIST
REDIS_RDB_TYPE_HASH_ZIPLIST
key總是一個字串對象,編碼和REDIS_RDB_TYPE_STRING類型的value一樣。
value根據TYPE類型不同,結構和長度也會不同。
EXPIRETIME_MS常量長度為1位元組,當程式讀入該常量時,會表示下一個讀入的將是一個以毫秒為單位的到期時間。
ms是一個8位元組長的帶正負號的整數,記錄了一個以毫秒為單位的unix時間戳記,即到期時間。
3.value編碼
a.字串對象
TYPE是REDIS_RDB_TYPE_STRING,字串對象編碼可以是REDIS_ENCODING_INT或者REDIS_ENCODING_RAW,對應儲存的實值型別是整數和字串。
如果字串對象編碼為REDIS_ENCODING_RAW,字串長度若大於20位元組,那麼這個字串會被壓縮儲存,否則原樣儲存。
無壓縮字串結構
len | string
壓縮後結構
REDIS_RDB_ENC_LZF | compressed_len | origin_len | compressed_string
其中REDIS_RDB_ENC_LZF常量標誌字串已被LZF演算法壓縮,程式在讀入過程中,碰到這個常量時,會根據之後的compressed_len和orgin_len和compressed_string 三部分對字串進行解壓。
b.列表對象
TYPE為REDIS_RDB_TYPE_LIST,value儲存的是一個REDIS_ENCODING_LINKEDLIST編碼的列表對象,結構如下
list_length | item1| item2 | item3 | ... | itemN
list_length記錄了列表的長度,item部分代表列表的項,每項都是字串對象。
c.集合對象
TYPE為REDIS_RDB_TYPE_SET,value儲存的是一個REDIS_ENCODING_HT編碼的對象集合,結構如下
set_size | elem1 | elem2 | elem3 | ... | elemN
set_size記錄集合大小,elem開頭部分代表元素集合,每個元素都是一個字串對象。
d.雜湊表對象
TYPE為REDIS_RDB_TYPE_HASH,value儲存的是一個REDIS_ENCODING_HT編碼的集合對象,結構如下
hash_size | key_value_pair 1 | key_value_pair 2 | key_value_pair 3 | ... | key_value_pair N
hash_size記錄了雜湊表的大小。key_value_pair部分代表索引值對,結構中的每個索引值對都以鍵緊挨著值的方式排列。結構如下
key1 | value1 | key2 | value2 | key3 | value3 | ....
e.有序集合對象
TYPE為REDIS_RDB_TYPE_ZSET,value儲存的是一個REDIS_ENCODING_SKIPLIST編碼的有序集合對象。結構如下
sorted_set_size | elem1 | elem2 | elem3 | ... | elemN
sorted_set_size記錄有序集合大小,elem開頭部分代表有序集合中的元素,每個元素又分為成員 (member)和分值(score)兩部分,成員是一個字串對象,分值則是一個double類型的浮點數,程式在儲存RDB檔案時會先將分支轉換成字串對象,再用儲存字串的方法將分值儲存起來。
有序集合中每個元素都是以成員緊挨著分值方式排列,結構如下
sorted_set_size | member1 | score 1 | member2 | score2 | ... | memberN | scoreN
f.INTSET編碼集合
TYPE為REDIS_RDB_TYPE_SET_INTSET,value儲存的是一個整數集合對象,RDB儲存這種對象方法是先將整數集合轉換為字串對象,再儲存到RDB檔案中。讀取是相反。
g.ZIPLIST編碼的列表、雜湊表或有序集合
TYPE為REDIS_RDB_TYPE_LIST_ZIPLIST、REDIS_RDB_TYPE_HASH_ZIPLIST或者REDIS_RDB_TYPE_ZSET_ZIPLIST,那麼value儲存的是一個壓縮列表對象,RDB檔案儲存方法是:
1)將壓縮列錶轉換成一個字串對象;
2)將轉換所得的字串對象儲存到RDB檔案。
讀取時做對應類型轉換即可。