Redis?哈希Hash底層數(shù)據(jù)結(jié)構(gòu)詳解
1. Redis 底層數(shù)據(jù)結(jié)構(gòu)
Redis數(shù)據(jù)庫就像是一個哈希表,首先對key進行哈希運算得到哈希值再取模得到一個下標,每個元素是一個節(jié)點,節(jié)點之間形成鏈表。這感覺有點像Java中的HashMap。
不同的數(shù)據(jù)類型的實現(xiàn)方式是不一樣的,可以通過object encoding命令查看底層真正的數(shù)據(jù)存儲結(jié)構(gòu)
同一種類型在不同的條件下所采用的數(shù)據(jù)結(jié)構(gòu)也不一樣,例如:
Redis是鍵值對形式的數(shù)據(jù)庫,key可以是任意值(PS:最終都會轉(zhuǎn)成string),value有多種數(shù)據(jù)類型
詳見:https://redis.io/docs/manual/data-types/data-types-tutorial/
至此,已經(jīng)很清楚,hash底層的結(jié)構(gòu)是 ziplist 和 hashtable
那么,什么時候會從ziplist轉(zhuǎn)成hashtable呢?這個在redis.conf中有相關(guān)的配置,如下:
默認情況下:
當ziplist中entry的數(shù)量超過512的時候,會轉(zhuǎn)成hashtable 單個元素的值超過64字節(jié)的時候,會轉(zhuǎn)成hashtable
2. hashtable
在Redis中hashtable就是字典dict
通過源碼,可以看到dict是這樣定義的:
3. redisDb 與 redisObject
通過源碼得知,redisDb代表redis數(shù)據(jù)庫,redisObject代表存到數(shù)據(jù)庫中的數(shù)據(jù)
字典dict的結(jié)構(gòu)前面已經(jīng)看過了,于是整個數(shù)據(jù)庫的結(jié)構(gòu)大概就是下面這個樣子:
4. ziplist
ziplist是一種特殊編碼的雙鏈表,被設(shè)計成非常節(jié)省內(nèi)存。它存儲字符串和整型值,其中整數(shù)被編碼為實際整數(shù),而不是一系列字符。它允許在O(1)時間內(nèi)在列表的任意一邊進行push和pop操作。但是,由于每個操作都需要重新分配ziplist所使用的內(nèi)存,因此實際的復(fù)雜性與ziplist所使用的內(nèi)存量有關(guān)。
ziplist的大體布局如下:
<zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>
<uint32_t zlbytes>: 一個無符號整數(shù),用于保存ziplist占用的字節(jié)數(shù),包括zlbytes字段本身的四個字節(jié)。需要存儲這個值,以便能夠調(diào)整整個結(jié)構(gòu)的大小,而不需要首先遍歷它。
<uint32_t zltail> : 列表中最后一個條目的偏移量。
<uint16_t zllen> : 條目的數(shù)量。當有超過2^16-2個條目時,這個值被設(shè)置為2^16-1,我們需要遍歷整個列表來知道它包含多少項。
<uint8_t zlend> : 一個特殊的條目,表示 ziplist 的結(jié)尾
5. linkedlist
linkedlist是一個雙向鏈表
6. quicklist
quicklistNode是一個32字節(jié)的結(jié)構(gòu)體,描述快表的ziplist。
quicklist = linkedlist + ziplist
到此這篇關(guān)于Redis 哈希Hash底層數(shù)據(jù)結(jié)構(gòu)詳解的文章就介紹到這了,更多相關(guān)Redis哈希底層數(shù)據(jù)結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis五大基本數(shù)據(jù)類型及對應(yīng)使用場景總結(jié)
Redis有五種基本數(shù)據(jù)類型,分別是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted?Set),這些基本數(shù)據(jù)類型使得Redis具備了豐富的數(shù)據(jù)結(jié)構(gòu)和功能,適用于各種不同的應(yīng)用場景,本文就給大家詳細的介紹一下這五大類型2023-08-08關(guān)于Redis未授權(quán)訪問漏洞利用的介紹與修復(fù)建議
Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API,下面這篇文章主要給大家介紹了關(guān)于Redis未授權(quán)訪問漏洞利用的介紹和修復(fù)建議,文中介紹的非常詳細,需要的朋友可以參考下。2017-07-07redisson中RRateLimiter分布式限流器的使用
Redisson Ratelimiter是Redisson框架中的一種限流算法,用于限制對資源的訪問頻率,本文主要介紹了redisson中RRateLimiter分布式限流器的使用,感興趣的可以了解一下2024-06-06Redis中緩存和數(shù)據(jù)庫雙寫數(shù)據(jù)不一致的原因及解決方案
這篇文章主要介紹了Redis中緩存和數(shù)據(jù)庫雙寫數(shù)據(jù)不一致的原因及解決方案,文中通過圖文結(jié)合的方式講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03Redis實戰(zhàn)之百度首頁新聞熱榜的實現(xiàn)代碼
這篇文章主要介紹了Redis實戰(zhàn)之百度首頁新聞熱榜的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02Spring?Boot?整合Redis?實現(xiàn)優(yōu)惠卷秒殺?一人一單功能
這篇文章主要介紹了Spring?Boot?整合Redis?實現(xiàn)優(yōu)惠卷秒殺?一人一單,在分布式系統(tǒng)下,高并發(fā)的場景下,會出現(xiàn)此類庫存超賣問題,本篇文章介紹了采用樂觀鎖來解決,需要的朋友可以參考下2022-09-09Redis實現(xiàn)分布式鎖(setnx、getset、incr)以及如何處理超時情況
本文主要介紹了Redis實現(xiàn)分布式鎖(setnx、getset、incr)以及如何處理超時情況,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11