日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

底层实现_Redis有序集合zset的底层实现

發(fā)布時(shí)間:2024/9/19 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 底层实现_Redis有序集合zset的底层实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 編碼

zset的編碼有ziplistskiplist兩種。
底層分別使用ziplist(壓縮鏈表)skiplist(跳表)實(shí)現(xiàn)。

  • 什么時(shí)候使用ziplist什么時(shí)候使用skiplist?

當(dāng)zset滿足以下兩個(gè)條件的時(shí)候,使用ziplist:

保存的元素少于128個(gè) 保存的所有元素大小都小于64字節(jié)

不滿足這兩個(gè)條件則使用skiplist。
(注意:這兩個(gè)數(shù)值是可以通過(guò)redis.conf的zset-max-ziplist-entries 和 zset-max-ziplist-value選項(xiàng) 進(jìn)行修改。)


2. 實(shí)現(xiàn)

  • ziplist編碼

關(guān)于什么是ziplist(壓縮鏈表),可以參見(jiàn)這篇文章:Redis源碼分析-壓縮列表ziplist

ziplist 編碼的有序集合對(duì)象使用壓縮列表作為底層實(shí)現(xiàn),每個(gè)集合元素使用兩個(gè)緊挨在一起的壓縮列表節(jié)點(diǎn)來(lái)保存,第一個(gè)節(jié)點(diǎn)保存元素的成員,第二個(gè)節(jié)點(diǎn)保存元素的分值。并且壓縮列表內(nèi)的集合元素按分值從小到大的順序進(jìn)行排列,小的放置在靠近表頭的位置,大的放置在靠近表尾的位置。

從小到大排列

ziplist結(jié)構(gòu)

  • skiplist編碼

skiplist 編碼的有序集合對(duì)象使用 zet 結(jié)構(gòu)作為底層實(shí)現(xiàn),一個(gè) zset 結(jié)構(gòu)同時(shí)包含一個(gè)字典和一個(gè)跳表:

typedef struct zset{ //跳躍表 zskiplist *zsl; //字典 dict *dice;} zset;

字典的鍵保存元素的值,字典的值則保存元素的分值;跳躍表節(jié)點(diǎn)的 object 屬性保存元素的成員,跳躍表節(jié)點(diǎn)的 score 屬性保存元素的分值。

這兩種數(shù)據(jù)結(jié)構(gòu)會(huì)通過(guò)指針來(lái)共享相同元素的成員和分值,所以不會(huì)產(chǎn)生重復(fù)成員和分值,造成內(nèi)存的浪費(fèi)。

說(shuō)明:其實(shí)有序集合單獨(dú)使用字典或跳躍表其中一種數(shù)據(jù)結(jié)構(gòu)都可以實(shí)現(xiàn),但是這里使用兩種數(shù)據(jù)結(jié)構(gòu)組合起來(lái),原因是假如我們單獨(dú)使用 字典,雖然能以 O(1) 的時(shí)間復(fù)雜度查找成員的分值,但是因?yàn)樽值涫且詿o(wú)序的方式來(lái)保存集合元素,所以每次進(jìn)行范圍操作的時(shí)候都要進(jìn)行排序;假如我們單獨(dú)使用跳躍表來(lái)實(shí)現(xiàn),雖然能執(zhí)行范圍操作,但是查找操作有 O(1)的復(fù)雜度變?yōu)榱薕(logN)。因此Redis使用了兩種數(shù)據(jù)結(jié)構(gòu)來(lái)共同實(shí)現(xiàn)有序集合。


參考資料:

  • Redis詳解(五)------ redis的五大數(shù)據(jù)類型實(shí)現(xiàn)原理
  • Redis源碼分析-壓縮列表ziplist

  • 作者:Katou_Megumi
    鏈接:https://www.jianshu.com/p/e5a516831ac2
    來(lái)源:簡(jiǎn)書(shū)
    著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

    總結(jié)

    以上是生活随笔為你收集整理的底层实现_Redis有序集合zset的底层实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。