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

Redis數(shù)據(jù)結(jié)構(gòu)原理淺析

 更新時(shí)間:2023年02月20日 09:14:24   作者:yunmengmeng  
這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)原理淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

RedisDb

Redis服務(wù)器默認(rèn)有16個(gè)數(shù)據(jù)庫(kù),一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)RedisDB數(shù)據(jù)結(jié)構(gòu)。

typedef struct redisDb {
    dict *dict;
    dict *expires;
    dict * blocking_keys;
    dict * ready_keys;
    dict * watched_keys;
    ......
}

  • dict:鍵空間散列表,用于存放所有鍵值對(duì)
  • expires:過(guò)期時(shí)間散列表,存放鍵的過(guò)期時(shí)間
  • blocking_keys:處于阻塞狀態(tài)的鍵和對(duì)應(yīng)的client
  • ready_keys:解除阻塞狀態(tài)的鍵和對(duì)應(yīng)的client,與blocking_keys屬性相對(duì)
  • watched_keys:watch的鍵和對(duì)應(yīng)的client,主要用于事務(wù)

RedisObject

Redis的鍵值都是redisObject對(duì)象,每次當(dāng)我們?cè)赗edis的數(shù)據(jù)庫(kù)中新創(chuàng)建一個(gè)鍵值對(duì)時(shí),會(huì)生成一個(gè)用于鍵名的redisObject對(duì)象和一個(gè)用于鍵值的redisObject對(duì)象

trpedef struct RedisObject {
    int4 type;
    int4 encoding;
    void *ptr;
    int24 lru;
    int32 refcount;
}
字段描述說(shuō)明
type用于表示Redis對(duì)應(yīng)的類型string、list、hash、set、zset、stream等,用枚舉表示
encoding內(nèi)部編碼int,embstr,raw,hashtable,quicklist, ziplist,intset,skiplist等,用枚舉表示
lru24位,可選LFU或LRU當(dāng)為L(zhǎng)RU時(shí),表示最后一次訪問(wèn)時(shí)間;當(dāng)為L(zhǎng)FU時(shí),高16位用來(lái)表示分鐘級(jí)別的訪問(wèn)時(shí)間,低8位用來(lái)表示訪問(wèn)頻次,頻次的增加使用的是概率算法,基數(shù)越大越難增加;訪問(wèn)時(shí)間更新時(shí),存在一定概率將訪問(wèn)頻次衰減。(兩者共有)訪問(wèn)時(shí)間是對(duì)一個(gè)數(shù)取模,當(dāng)前時(shí)間也取模, 當(dāng)前時(shí)間大于訪問(wèn)時(shí)間,則為兩數(shù)之差;當(dāng)前時(shí)間小于訪問(wèn)時(shí)間,則為當(dāng)前時(shí)間加上模數(shù)與訪問(wèn)時(shí)間之差
refcount引用計(jì)數(shù)初始值為1,實(shí)際應(yīng)用中參考意義不大
ptr指針,占8個(gè)字節(jié),指向數(shù)據(jù)的地址dict、expires等,指針指向同一個(gè)地址

object命令,就是對(duì)RedisObject的相關(guān)操作。

修改內(nèi)存淘汰策略

object idletime key # 返回key的空閑時(shí)間,即上次讀寫(xiě)鍵以來(lái)經(jīng)過(guò)的近似描述,在lfu模式下不可用

config set maxmemory-policy volatile-lfu # 修改內(nèi)存淘汰策略
set name zhangsan
object freq name # 獲取計(jì)數(shù)值,僅lfu模式下可用,初始化為5

get name

object freq name # 再次訪問(wèn),返回為6

int

當(dāng)string值為整數(shù)并且小于等于long的最大值時(shí),encoding為int類型,ptr直接指向該int型地址

embstr與raw

Redis的字符串叫SDS(Simple Dynamic String,簡(jiǎn)單字符串),對(duì)應(yīng)key,非整數(shù)型的String值

trpedef struct SDS {
    int8 capacity; // 數(shù)組容量
    int8 len; // 實(shí)際長(zhǎng)度
    int8 flags;
    byte[] content; // 數(shù)組內(nèi)容
}

可以看出,SDS與Java的ArrayList結(jié)構(gòu)類似,也是分配初始長(zhǎng)度,長(zhǎng)度超出時(shí)擴(kuò)容。Redis規(guī)定字符串的長(zhǎng)度不能超過(guò)512M。

當(dāng)長(zhǎng)度特別短時(shí),使用embstr形式存儲(chǔ);當(dāng)長(zhǎng)度超出44字節(jié)時(shí),使用raw形式存儲(chǔ)。

已知內(nèi)存分配器最大分配單位是64字節(jié),RedisObject占16個(gè)字節(jié),SDS標(biāo)識(shí)占3個(gè)字節(jié),字符串以NULL結(jié)尾需要占用一個(gè)字節(jié),因此當(dāng)字符串長(zhǎng)度小于等于44時(shí),只需要分配一次內(nèi)存。RedisObject與SDS在同一內(nèi)存單位,我們將這種數(shù)據(jù)結(jié)構(gòu)稱為embstr,而不在同一內(nèi)存單位的,稱為raw。

dict

dict(encoding編碼為hashtable類型,字典)對(duì)應(yīng)hash、set、zset(用于存儲(chǔ)value與score的映射)集合。

dict與Java的HashMap結(jié)構(gòu)類似,不同的是HashMap擴(kuò)容是申請(qǐng)數(shù)組,然后遍歷,將舊數(shù)據(jù)重新hash后掛到數(shù)組下面,作為單線程的Redis很難承受這樣耗時(shí)的過(guò)程,所以它使用了兩個(gè)數(shù)組,先返回,然后空閑的時(shí)候一點(diǎn)一點(diǎn)搬數(shù)據(jù),搬完之后再將舊數(shù)據(jù)清空,我們將這樣的過(guò)程成為漸進(jìn)式rehash。

typedef struct dict {
    dictht ht[2];
}

以上就是Redis數(shù)據(jù)結(jié)構(gòu)原理淺析的詳細(xì)內(nèi)容,更多關(guān)于Redis數(shù)據(jù)結(jié)構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis 過(guò)期鍵刪除策略的實(shí)現(xiàn)示例

    Redis 過(guò)期鍵刪除策略的實(shí)現(xiàn)示例

    Redis的過(guò)期數(shù)據(jù)刪除策略主要有三種,包括定時(shí)刪除、惰性刪除和定期刪除,本文主要介紹了Redis 過(guò)期鍵刪除策略的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Redis慢查詢?nèi)罩九c監(jiān)視器問(wèn)題

    Redis慢查詢?nèi)罩九c監(jiān)視器問(wèn)題

    這篇文章主要介紹了Redis慢查詢?nèi)罩九c監(jiān)視器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • K8S部署Redis(單機(jī)、集群)的超詳細(xì)步驟

    K8S部署Redis(單機(jī)、集群)的超詳細(xì)步驟

    redis是一款基于BSD協(xié)議,開(kāi)源的非關(guān)系型數(shù)據(jù)庫(kù)(nosql數(shù)據(jù)庫(kù))這篇文章主要給大家介紹了關(guān)于K8S部署Redis(單機(jī)、集群)的超詳細(xì)步驟,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • window手動(dòng)操作清理redis緩存的技巧總結(jié)

    window手動(dòng)操作清理redis緩存的技巧總結(jié)

    在本篇文章中小編給大家分享了關(guān)于window環(huán)境手動(dòng)操作清理redis緩存的方法和技巧,有興趣的朋友們可以跟著學(xué)習(xí)下。
    2019-07-07
  • Redis的Python客戶端redis-py安裝使用說(shuō)明文檔

    Redis的Python客戶端redis-py安裝使用說(shuō)明文檔

    這篇文章主要介紹了Redis的Python客戶端redis-py安裝使用說(shuō)明文檔,本文講解了安裝方法、入門使用實(shí)例、API參考和詳細(xì)說(shuō)明,需要的朋友可以參考下
    2015-06-06
  • redis的hash類型操作方法

    redis的hash類型操作方法

    Hash 是一個(gè) String 類型的 field(字段) 和 value(值) 的映射表,hash 特別適合用于存儲(chǔ)對(duì)象,這篇文章主要介紹了redis的hash類型的詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Redis?sentinel哨兵集群的實(shí)現(xiàn)步驟

    Redis?sentinel哨兵集群的實(shí)現(xiàn)步驟

    本文主要介紹了Redis?sentinel哨兵集群的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Redis實(shí)現(xiàn)分布式鎖的幾種方法總結(jié)

    Redis實(shí)現(xiàn)分布式鎖的幾種方法總結(jié)

    這篇文章主要介紹了Redis實(shí)現(xiàn)分布式鎖的幾種方法總結(jié)的相關(guān)資料, Redis實(shí)現(xiàn)與Zookeeper實(shí)現(xiàn)和數(shù)據(jù)庫(kù)實(shí)現(xiàn),需要的朋友可以參考下
    2017-07-07
  • redis專屬鏈表ziplist的使用

    redis專屬鏈表ziplist的使用

    本文主要介紹了redis專屬鏈表ziplist的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 淺談redis緩存在項(xiàng)目中的使用

    淺談redis緩存在項(xiàng)目中的使用

    最近由于項(xiàng)目需要,在系統(tǒng)緩存服務(wù)部分上用到了redis,本文就淺談下在redis緩存在項(xiàng)目中的使用,感興趣的小伙伴們可以參考一下
    2021-05-05

最新評(píng)論