Redis RDB檔案結構

來源:互聯網
上載者:User

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檔案。

讀取時做對應類型轉換即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.