欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis?哈希Hash底層數(shù)據(jù)結(jié)構(gòu)詳解

 更新時間:2022年08月02日 08:48:45   作者:廢物大師兄  
這篇文章主要介紹了Redis?哈希Hash底層數(shù)據(jù)結(jié)構(gòu)詳解的相關(guān)資料,需要的朋友可以參考下

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ù)類型及對應(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ù)建議

    關(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-07
  • redisson中RRateLimiter分布式限流器的使用

    redisson中RRateLimiter分布式限流器的使用

    Redisson Ratelimiter是Redisson框架中的一種限流算法,用于限制對資源的訪問頻率,本文主要介紹了redisson中RRateLimiter分布式限流器的使用,感興趣的可以了解一下
    2024-06-06
  • Redis中緩存和數(shù)據(jù)庫雙寫數(shù)據(jù)不一致的原因及解決方案

    Redis中緩存和數(shù)據(jù)庫雙寫數(shù)據(jù)不一致的原因及解決方案

    這篇文章主要介紹了Redis中緩存和數(shù)據(jù)庫雙寫數(shù)據(jù)不一致的原因及解決方案,文中通過圖文結(jié)合的方式講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • Redis實戰(zhàn)之百度首頁新聞熱榜的實現(xiàn)代碼

    Redis實戰(zhàn)之百度首頁新聞熱榜的實現(xiàn)代碼

    這篇文章主要介紹了Redis實戰(zhàn)之百度首頁新聞熱榜的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Spring?Boot?整合Redis?實現(xiàn)優(yōu)惠卷秒殺?一人一單功能

    Spring?Boot?整合Redis?實現(xiàn)優(yōu)惠卷秒殺?一人一單功能

    這篇文章主要介紹了Spring?Boot?整合Redis?實現(xiàn)優(yōu)惠卷秒殺?一人一單,在分布式系統(tǒng)下,高并發(fā)的場景下,會出現(xiàn)此類庫存超賣問題,本篇文章介紹了采用樂觀鎖來解決,需要的朋友可以參考下
    2022-09-09
  • Redis實現(xiàn)消息的發(fā)布訂閱原理分析

    Redis實現(xiàn)消息的發(fā)布訂閱原理分析

    本文主要介紹了Redis實現(xiàn)消息的發(fā)布訂閱原理分析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Redis中常見的幾種集群部署方案

    Redis中常見的幾種集群部署方案

    本文主要介紹了Redis中常見的幾種集群部署方案,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis實現(xiàn)分布式鎖(setnx、getset、incr)以及如何處理超時情況

    Redis實現(xiàn)分布式鎖(setnx、getset、incr)以及如何處理超時情況

    本文主要介紹了Redis實現(xiàn)分布式鎖(setnx、getset、incr)以及如何處理超時情況,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Redis突現(xiàn)拒絕連接問題處理方案

    Redis突現(xiàn)拒絕連接問題處理方案

    這篇文章主要介紹了Redis突現(xiàn)拒絕連接問題處理方案,分析原因是由于redis與業(yè)務(wù)共一個服務(wù)器,內(nèi)存只有8G,業(yè)務(wù)服務(wù)啟動過多,內(nèi)存不足導(dǎo)致redis拒絕連接,需要的朋友可以參考下
    2024-02-02

最新評論