最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis數(shù)據(jù)結(jié)構(gòu)SortedSet的底層原理解析

 更新時(shí)間:2022年07月13日 15:59:08   作者:空指針異常1  
這篇文章主要介紹了Redis數(shù)據(jù)結(jié)構(gòu)SortedSet的底層原理解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

概述

一些常用命令

  • 存儲(chǔ):zadd key score value
  • 獲?。?strong>zrange key start end
  • 獲?。和瑫r(shí)獲取分?jǐn)?shù):zrange key start end with score
  • 刪除:zrem key value

存儲(chǔ)的時(shí)候我們可以發(fā)現(xiàn),是有一個(gè)score(分?jǐn)?shù))的,這個(gè)就是用來排序的字段。

實(shí)現(xiàn)

先說結(jié)論,SortedSet底層,根據(jù)配置會(huì)在不同的時(shí)候選用兩種不同的數(shù)據(jù)結(jié)構(gòu)zset,或ziplist進(jìn)行存儲(chǔ):

首先,我們來看幾個(gè)參數(shù):

zset-max-ziplist-entries 128
zset-max-ziplist-value 64
if (
    field-value對的數(shù)量 > ziplist.entries.size ||
    任意一個(gè)filed或value長度 > zset-max-ziplist-value
) {
    // 使用 zset 進(jìn)行存儲(chǔ)
} else {
    // 使用 ziplist 進(jìn)行存儲(chǔ)

zset的結(jié)構(gòu)如下:

typedef struct zset {
    dict *dict;
    zskiplist *zsl;
} zset

可以發(fā)現(xiàn),是由字典+跳躍表實(shí)現(xiàn)的。

  • zset 結(jié)構(gòu)體里有兩個(gè)元素,一個(gè)是 dict,用來維護(hù) 數(shù)據(jù) 到 分?jǐn)?shù) 的關(guān)系,一個(gè)是 zskiplist,用來維護(hù) 分?jǐn)?shù)所在鏈表 的關(guān)系
  • dict 里通過維護(hù) 哈希表 存儲(chǔ)了 張三=>100,李四=>90 的分?jǐn)?shù)關(guān)系。

而跳表則是排序的關(guān)鍵

跳躍表

先上圖:

我們知道,鏈表的檢索效率是非常低的,如果要拿到100條數(shù)據(jù)中間的數(shù)據(jù),則需要遍歷50個(gè)數(shù)據(jù)才行,為了解決這個(gè)問題,跳表應(yīng)運(yùn)而生

如上圖,就是常規(guī)的跳表,會(huì)在原有的數(shù)據(jù)上加上若干層,指向當(dāng)前層的下一個(gè)節(jié)點(diǎn)。

跳表的插入

如上圖所示:其實(shí)每個(gè)節(jié)點(diǎn)的層數(shù)是隨機(jī)的,而且新插入一個(gè)節(jié)點(diǎn)不會(huì)影響其它節(jié)點(diǎn)的層數(shù)。因此,插入操作只需要修改插入節(jié)點(diǎn)前后的指針,而不需要對很多節(jié)點(diǎn)都進(jìn)行調(diào)整。這就降低了插入操作的復(fù)雜度。實(shí)際上,這是skiplist跳表的一個(gè)很重要的特性,這讓它在插入性能上明顯優(yōu)于平衡樹的方案。

如下圖,假如我們需要查詢23,查詢的路徑如下。

事實(shí)上,在插入之前也要先經(jīng)歷一個(gè)類似的查找過程,在確定插入位置后,再完成插入操作。

這也是SortedSet實(shí)現(xiàn)排序的原理。

壓縮列表

壓縮列表 ziplist 是為 Redis 節(jié)約內(nèi)存而開發(fā)的。

壓縮列表是由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型數(shù)據(jù)結(jié)構(gòu),一個(gè)壓縮列表可以包含任意多個(gè)節(jié)點(diǎn) (entry),每個(gè)節(jié)點(diǎn)可以保存 一個(gè)字節(jié)數(shù)組 或者 一個(gè)整數(shù)值 。

1、zl bytes:用于記錄整個(gè)壓縮列表占用的內(nèi)存字節(jié)數(shù)

2、zl tail:記錄要列表尾節(jié)點(diǎn)距離壓縮列表的起始地址有多少字節(jié)

3、zl len:記錄了壓縮列表包含的節(jié)點(diǎn)數(shù)量。

4、entryX:要說列表包含的各個(gè)節(jié)點(diǎn)

5、zl end:用于標(biāo)記壓縮列表的末端

壓縮列表是一種為了節(jié)約內(nèi)存而開發(fā)的順序型數(shù)據(jù)結(jié)構(gòu)

壓縮列表被用作列表鍵和哈希鍵的底層實(shí)現(xiàn)之一

壓縮列表可以包含多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可以保存一個(gè)字節(jié)數(shù)組或者整數(shù)值

添加新節(jié)點(diǎn)到壓縮列表,可能會(huì)引發(fā)連鎖更新操作。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis分布式鎖防止緩存擊穿的實(shí)現(xiàn)

    Redis分布式鎖防止緩存擊穿的實(shí)現(xiàn)

    本文主要介紹了Redis分布式鎖防止緩存擊穿的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 詳解如何發(fā)現(xiàn)并解決Redis熱點(diǎn)Key問題

    詳解如何發(fā)現(xiàn)并解決Redis熱點(diǎn)Key問題

    Redis 熱點(diǎn) Key 是指在某一時(shí)間段內(nèi),被大量的讀寫操作命中的 Key,這種情況可能會(huì)導(dǎo)致性能瓶頸,數(shù)據(jù)一致性問題,緩存擊穿等問題,所以本文給大家介紹了如何發(fā)現(xiàn)并解決Redis熱點(diǎn)Key問題,需要的朋友可以參考下
    2024-05-05
  • 在redisCluster中模糊獲取key方式

    在redisCluster中模糊獲取key方式

    這篇文章主要介紹了在redisCluster中模糊獲取key方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Redis設(shè)置鍵的生存時(shí)間或過期時(shí)間的方法詳解

    Redis設(shè)置鍵的生存時(shí)間或過期時(shí)間的方法詳解

    這篇文章主要介紹了Redis如何設(shè)置鍵的生存時(shí)間或過期時(shí)間,通過EXPIRE命令或者PEXIPIRE命令,客戶端可以以秒或者毫秒精度為數(shù)據(jù)庫中的某個(gè)鍵設(shè)置生存時(shí)間,文中有詳細(xì)的代碼供供大家參考,需要的朋友可以參考下
    2024-03-03
  • Redis的Spring客戶端使用小結(jié)

    Redis的Spring客戶端使用小結(jié)

    在Spring中使用Redis,可以極大地提升應(yīng)用程序的性能和響應(yīng)速度,本文主要介紹了Redis的Spring客戶端使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • redis 用scan指令 代替keys指令(詳解)

    redis 用scan指令 代替keys指令(詳解)

    下面小編就為大家分享一篇redis 用scan指令 代替keys指令詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • redis中數(shù)據(jù)類型命令整理

    redis中數(shù)據(jù)類型命令整理

    在本篇文章里小編給大家整理的是關(guān)于redis中5種數(shù)據(jù)類型基本命令介紹,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • 在Redis中如何保存時(shí)間序列數(shù)據(jù)詳解

    在Redis中如何保存時(shí)間序列數(shù)據(jù)詳解

    與發(fā)生時(shí)間相關(guān)的一組數(shù)據(jù),就是時(shí)間序列數(shù)據(jù),這些數(shù)據(jù)的特點(diǎn)是沒有嚴(yán)格的關(guān)系模型,記錄的信息可以表示成鍵和值的關(guān)系,這篇文章主要給大家介紹了關(guān)于在Redis中如何保存時(shí)間序列數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Redis實(shí)現(xiàn)庫存扣減的解決方案防止商品超賣

    Redis實(shí)現(xiàn)庫存扣減的解決方案防止商品超賣

    在日常開發(fā)中有很多地方都有類似扣減庫存的操作,比如電商系統(tǒng)中的商品庫存,抽獎(jiǎng)系統(tǒng)中的獎(jiǎng)品庫存等,基于redis實(shí)現(xiàn)扣減庫存的具體實(shí)現(xiàn),初始化庫存回調(diào)函數(shù)(IStockCallback)扣減庫存服務(wù)(StockService),感興趣的朋友跟隨小編一起看看吧
    2022-06-06
  • Redis的大Key對持久化影響分析

    Redis的大Key對持久化影響分析

    為了保證數(shù)據(jù)的持久性,Redis提供了兩種持久化的方式,本文主要介紹了Redis的大Key對持久化影響分析,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04

最新評論

巴林右旗| 连州市| 金门县| 全州县| 佛山市| 东丽区| 安国市| 昭觉县| 兰州市| 和政县| 陵川县| 绵阳市| 集安市| 和林格尔县| 射阳县| 西宁市| 镇康县| 如东县| 阿荣旗| 萨嘎县| 湖南省| 克拉玛依市| 滦平县| 平原县| 阳城县| 霍邱县| 丹巴县| 融水| 鄱阳县| 日土县| 朔州市| 襄樊市| 阿合奇县| 都安| 常山县| 蕉岭县| 宁晋县| 尉犁县| 扎赉特旗| 宣恩县| 射洪县|