redis 的資料結構和內部編碼

2021-08-20 11:23:29 字數 1533 閱讀 9022

首先,從網上找來一張鎮樓

redis對外展現五種資料型別,string(字串),hash(雜湊)、list(列表)、set(集合)、zset(有序集合)。每種資料結構,redis都提供了不同的內部編碼實現方式(內部編碼可以通過

object encoding key

檢視),以便使用不同的場景 

1、string

1)int:8個位元組的長整型,如果乙個字串儲存的型別是整數值,並且這個值可以 用long型別來表示,name字串物件會將整數值儲存在字串物件結構的ptr屬性裡面,並將字串物件的編碼設定為int。

2)embstr:小於等於39個位元組的字串,embstr編碼是專門用於儲存短字串的優化編碼方式。相比raw有如下好處:

a、embstr編碼將建立字串物件所需的空間分配的次數從raw編碼的兩次降低為一次。

b、釋放embstr編碼的字串物件只需要呼叫一次記憶體釋放函式,而釋放raw編碼物件的字串物件需要呼叫兩次記憶體釋放函式

c、因為embstr編碼的字串物件的所有資料都儲存在一塊連續的記憶體裡面,所以這種編碼的字串物件比起raw編碼的字串物件能更好地利用快取帶來的優勢。

3)raw:大於39個位元組的字串,用簡單動態字串(sds)來儲存,將這個字串的物件編碼設定為raw。

ps:sds相比傳統字串的優點:因為儲存了長度欄位常o(1)時間複雜度獲取字串長度;杜絕緩衝區溢位;減少修改字串時帶來的記憶體重分配次數;

2、雜湊的內部編碼

1)ziplist(壓縮列表):當雜湊型別元素小於has-max-ziplist-entries配置(預設512個),同事所有值都小於hash-max-ziplist-value配置(預設64個位元組)時,redis會使用ziplist作為雜湊的內部實現。ziplist使用更加緊湊的結構實現多個元素的連續儲存,所以在節省記憶體方面比hashtable更加優秀

2)hashtable(雜湊表):當雜湊型別無法滿足ziplist的條件時,redis會使用hashtable作為雜湊的內部實現。因為ziplist的讀寫效率會下降,而hashtable的讀寫時間複雜度為o(1)

3、列表的內部編碼

1)ziplist(壓縮列表)

2)linkedlist(鍊錶):當列表型別無法滿足條件的時候,redis會使用linkedlist作為列表的內部實現

4、集合

1)intset(整數集合):當集合中的元素都是整數且元素個數小於set-max-intset-entries配置(預設512個)是,redis會選intset作為集合的內部實現,從而減少記憶體使用

2)hashtable:當集合元素無法滿足intset的條件時,redis會使用hashtable作為集合的內部實現

5、zset有序集合的內部編碼

1)ziplist:

2)skiplist(跳躍表):當ziplist條件不滿足的時候,有序集合會使用skiplist作為內部 實現,因為ziplist的讀寫效率會下降

參考:設計與實現》

Redis中的資料結構和內部編碼

redis儲存結構是一張雜湊表,類似於hashmap的結構即陣列加鍊表 可以理解為redis中儲存的值對外的儲存結構型別,也就是type命令查詢到的型別,如hash,list,string。指的是如hash這個型別redis內部又分為不同的實現,通過object encoding key可以檢視va...

redis內部資料結構的資料結構

redis對外的公眾的資料結構有五種string,list,set,hash,zset 編碼常量 編碼所對應的底層資料結構 redis encoding int long 型別的整數 redis encoding embstr embstr 編碼的簡單動態字串 redis encoding raw ...

Redis之基礎NO 1(資料結構和內部編碼)

1,檢視所有鍵 keys 時間複雜度 o n 2,鍵總數 dbsize 時間複雜度是 o 1 3,檢查鍵是否存在 exists key 存在返回1,否則返回0 4,刪除鍵 del key 成功則返回刪除鍵的個數,否則0。支援刪除多個鍵 5,鍵過期 expire key seconds ttl 命令返...