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

歡迎訪問 生活随笔!

生活随笔

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

数据库

Redis的设计与实现之跳表

發(fā)布時(shí)間:2024/4/18 数据库 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis的设计与实现之跳表 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

跳躍表基本概念?

  • 跳躍表是(skiplist)是一種有序的數(shù)據(jù)結(jié)構(gòu),通過在每個(gè)節(jié)點(diǎn)中維持多個(gè)指向其他節(jié)點(diǎn)的指針,從而使查找更加迅速。
  • 跳躍表的查找時(shí)間復(fù)雜度平均O(logN),最壞O(n)。
  • 跳躍表可以看作為是一個(gè)升級版的鏈表,從原理來推的話也有些像是從二叉樹演變過來的。
  • Redis中有序集合鍵的底層實(shí)現(xiàn)之一就是跳躍表(有序集合元素?cái)?shù)量比較多,有序集合元素的成員是比較長的字符串)

快速了解跳躍表的底層推薦一篇博客:https://www.jianshu.com/p/09c3b0835ba6。

跳躍表的實(shí)現(xiàn)

前邊提到過,跳躍表可以稱得上是一個(gè)進(jìn)化版的鏈表,跳躍表中每一層的每一個(gè)節(jié)點(diǎn)都有一個(gè)前進(jìn)指針,和跨度(就是當(dāng)前指針指的節(jié)點(diǎn)和現(xiàn)在節(jié)點(diǎn)的距離),當(dāng)然還有回退指針等,下邊就來詳細(xì)的分析以下它的底層數(shù)據(jù)結(jié)構(gòu)和設(shè)計(jì)思路。

跳躍表節(jié)點(diǎn)的設(shè)計(jì)思路

typedef struct zskiplistNode{//后退struct zskiplistNode *backward;//分值double score;//成員對象robj *obj;//層struct zskiplistLevel{//前進(jìn)指針struct zskiplistNode *forward;//跨度unsigined int span;} level[]; }zskiplistNode;前進(jìn)指針:比如我們需要遍歷所有的跳躍表節(jié)點(diǎn),那就使用前進(jìn)指針來一步一步向前遍歷(指向的節(jié)點(diǎn)跨度為1就相當(dāng)于遍歷了)后退指針:可以進(jìn)行從后往前的遍歷,從上邊的結(jié)構(gòu)體可以看到,每一個(gè)節(jié)點(diǎn)只有一個(gè)backward指針,因此,從后往前的遍歷結(jié)過也一定是唯一的。跨度就相當(dāng)于現(xiàn)實(shí)生活中的路程,也可以說成為里程,或者是排位。指向null的所有節(jié)點(diǎn)的跨度都為0.obj:是指向一個(gè)SDS類型的指針,它就是保存的值在我們使用有序集合的時(shí)候,它的有序性就是利用score來決定的,因此score是有序性的保證。層的實(shí)現(xiàn)是一個(gè)數(shù)組,為什么是一個(gè)數(shù)組有沒有想過? 我認(rèn)為它是為了在查找過程中從上往下,從大跨度到小跨度,縮小范圍的時(shí)候就層數(shù)減一進(jìn)入下一層搜索。 level可以包含多個(gè)元素,每一個(gè)元素都包含一個(gè)zskiplistLevel的結(jié)構(gòu)體(指向其他節(jié)點(diǎn)的指針):可以理解為level是某一個(gè)SDS值存的指向其他SDS值的指針。 每次創(chuàng)建新的跳躍表節(jié)點(diǎn)時(shí),程序根據(jù)冪等定律(越大的數(shù)出現(xiàn)的概率越少)隨機(jī)生成一個(gè)1到32層的值作為level數(shù)組的大小。

跳躍表

跳躍表就是多個(gè)跳躍表節(jié)點(diǎn)組成,通過一個(gè)跳躍表節(jié)點(diǎn)來標(biāo)記和記錄一些跳躍表的信息(zskiplist)。

typedef struct zskiplist{//表頭和表尾struct skiplistNode *header,*tial;//表中節(jié)點(diǎn)數(shù)量unsigined long length;//表中最大的層數(shù) int level;}zskiplist;

理解了前面的,這個(gè)就只是一個(gè)頭節(jié)點(diǎn)記錄一些東西罷了。
跳躍表雖然實(shí)現(xiàn)不難,但是對于有序查找效率還是極高的!

總結(jié)

以上是生活随笔為你收集整理的Redis的设计与实现之跳表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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