首頁 >常見問題 >redis五種資料結構如何底層實現

redis五種資料結構如何底層實現

醉折花枝作酒筹
醉折花枝作酒筹原創
2021-07-07 10:38:505824瀏覽

實現方法:1、每種資料結構都有自己底層的內部編碼實現,而且是多種實現,這樣Redis會在合適的場景選擇合適的內部編碼;2、每種資料結構都有兩種以上的內部編碼實作;3、內部編碼可以作為多種外部資料結構的內部實作。

redis五種資料結構如何底層實現

本教學操作環境:windows7系統、Redis5.0.10版、DELL G3電腦。

Redis有五種基本資料結構:字串、hash、set、zset、list。以下解釋下載Redis 3.0.6版本中底層是怎麼實現他們的。

總結一下

(1)每種資料結構都有自己底層的內部編碼實現,而且是多種實現,這樣Redis會在合適的場景選擇合適的內部編碼。

(2)可以看到每種資料結構都有兩種以上的內部編碼實現,例如string資料結構就包含了raw、int和embstr三種內部編碼。

(3)同時,有些內部編碼可以作為多種外部資料結構的內部實現,例如ziplist就是hash、list和zset共有的內部編碼。

動態字串SDS

SDS是「simple dynamic string」的縮寫。 Redis中所有場景出現的字串,基本上都是有SDS來實現的:

  • 所有非數字的key, 如:set msg “hello” 中的key msg

  • 字串資料類型的值,如:set msg “hello” 中的value “hello”

  • 非字串資料型別中的「字符串值”,如:rpush fruits “apple” “banana”中的"apple” “banana”

##SDS長這樣:

redis五種資料結構如何底層實現

free:剩下多少空間

len:字串長度

buf:存放的字元陣列

空間預先分配

#為減少修改字串代理的記憶體重新分配次數,SDS採用了「一次管夠「的策略:

  • 若修改之後SDS長度
  • 若修改之後SDS長度>= 1MB ,擴充除了滿足修改後的長度外,額外多1MB空間。

惰性空間釋放

為避免縮短字串時候的記憶體重新分配操作,SDS在資料減少時,並不會立刻釋放空間。

int

就是redis中存放的各種數字,包括故意加上「」的

set game 「111 ”

雙向鍊錶

雙向鍊錶如lpush, rpush, lpop, rpop

長這樣:

redis五種資料結構如何底層實現

分成兩部分:

    「統籌部分」:橘黃色
    • head:指向具體雙向鍊錶的頭

    • tail:指向特定雙向鍊錶的尾巴

    • len:雙向鍊錶的長度

  • 「具體實施方」:藍色
    • 有前驅pre和後繼next

雙向鍊錶由list 和listNode 兩個資料結構構成。

相關教學推薦:

Redis教學

以上是redis五種資料結構如何底層實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn