??一個(gè)不甘平凡的普通人,致力于為Golang社區(qū)和算法學(xué)習(xí)做出貢獻(xiàn),期待您的關(guān)注和認(rèn)可,陪您一起學(xué)習(xí)打卡?。。??????
??專欄:算法學(xué)習(xí)
??專欄:Go實(shí)戰(zhàn)
??個(gè)人主頁:個(gè)人主頁
跳表問題
1. redis數(shù)據(jù)結(jié)構(gòu)
redis 有五種數(shù)據(jù)結(jié)構(gòu):string,hash,list,set,zset
2. zset底層數(shù)據(jù)結(jié)構(gòu):
壓縮列表 或者 跳表 實(shí)現(xiàn)
壓縮列表的實(shí)現(xiàn)底層數(shù)據(jù)結(jié)構(gòu):底層是一個(gè)數(shù)組,相對于數(shù)組多的是一個(gè)列表長度,尾部偏移量,列表元素個(gè)數(shù)和列表結(jié)束表標(biāo)識(shí),可以更好的找到列表的首部和尾部,對于中間的其他元素來說仍然需要進(jìn)行遍歷,所以時(shí)間復(fù)雜度是o(n)
3. 什么時(shí)候采用壓縮列表?
有序集合保存的元素?cái)?shù)量小于128個(gè) 有序集合保存的所有元素長度小于64字節(jié)
4. 跳表是什么?
跳表是在壓縮列表的基礎(chǔ)上增加了多級(jí)索引,通過多級(jí)索引的位置進(jìn)行跳轉(zhuǎn),實(shí)現(xiàn)了快速查找元素 跳表skiplist的尋址邏輯可以簡單地概括為: 從最高層開始尋址,當(dāng)前節(jié)點(diǎn)的next指針如果指向null的話就下降一層,next指針指向的下一個(gè)元素值如果小于查找值,就繼續(xù)走,如果大于的話就調(diào)用backward后退指針找前一個(gè)元素再比較,直到找到對應(yīng)的位置。
舉例: 普通鏈表需要逐個(gè)遍歷找到目標(biāo)值27
跳表建立一級(jí)索引,每隔一個(gè)值建立一個(gè)索引,可以找到目標(biāo)元素
或者在一級(jí)索引的基礎(chǔ)上,建立二級(jí)索引來加快查找速度
時(shí)間復(fù)雜度是o(logn)
5.在最前面我們提到redis最終并沒有采用樹這樣的結(jié)構(gòu),其中一個(gè)原因就跟指針個(gè)數(shù)有關(guān):
(不清楚樹的數(shù)據(jù)結(jié)構(gòu)也沒關(guān)系,只需要知道樹的指針固定有兩個(gè),左子樹指針 和 右子樹指針) 跳表節(jié)點(diǎn)的平均指針數(shù)是1.3個(gè),而樹的指針數(shù)固定為2個(gè),指針又占用一定內(nèi)存,顯然跳表比樹是用到更少的內(nèi)存,redis是基于內(nèi)存的操作,瓶頸最有可能就是內(nèi)存大小和網(wǎng)絡(luò)帶寬,所以跳表比起樹更節(jié)約內(nèi)存一點(diǎn)。
文章來源:http://www.zghlxwxcb.cn/news/detail-448115.html
我是不想擺爛的 今天也要向佬學(xué)習(xí)
碼字不易,感謝您的閱讀,希望對您有所幫助。關(guān)注我,完成每日算法自律打卡,學(xué)習(xí)什么時(shí)候開始都不晚??!文章來源地址http://www.zghlxwxcb.cn/news/detail-448115.html
到了這里,關(guān)于[Redis] 數(shù)據(jù)結(jié)構(gòu)zset壓縮列表實(shí)現(xiàn)和跳表實(shí)現(xiàn)講解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!