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

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

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

概述

一些常用命令

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

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

實(shí)現(xiàn)

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

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

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

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

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

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

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

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

跳躍表

先上圖:

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

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

跳表的插入

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

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

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

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

壓縮列表

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • RediSearch加RedisJSON大于Elasticsearch的搜索存儲引擎

    RediSearch加RedisJSON大于Elasticsearch的搜索存儲引擎

    這篇文章主要為大家介紹了RediSearch加RedisJSON大于Elasticsearch的王炸使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Redis過期刪除策略與內(nèi)存淘汰策略

    Redis過期刪除策略與內(nèi)存淘汰策略

    這篇文章主要介紹了Redis過期刪除策略與內(nèi)存淘汰策略,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 關(guān)于Redis未授權(quán)訪問的問題

    關(guān)于Redis未授權(quán)訪問的問題

    這篇文章主要介紹了Redis未授權(quán)訪問的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • redis的bigkey掃描腳本深入介紹

    redis的bigkey掃描腳本深入介紹

    這篇文章主要給大家介紹了關(guān)于redis的bigkey掃描腳本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Redis Set 集合的實(shí)例詳解

    Redis Set 集合的實(shí)例詳解

    這篇文章主要介紹了 Redis Set 集合的實(shí)例詳解的相關(guān)資料,Redis的Set是string類型的無序集合。集合成員是唯一的,并且不重復(fù),需要的朋友可以參考下
    2017-08-08
  • 你了解Redis事務(wù)嗎

    你了解Redis事務(wù)嗎

    說到事務(wù),大家會立刻想到Mysql的事務(wù),所謂的事務(wù)就是對數(shù)據(jù)進(jìn)行一系列的操作,要么都執(zhí)行成功,要么都執(zhí)行失敗,下面就介紹一下Redis如何實(shí)現(xiàn)事務(wù),感興趣的可以了解一下
    2022-08-08
  • Redis實(shí)現(xiàn)訂單自動過期功能的示例代碼

    Redis實(shí)現(xiàn)訂單自動過期功能的示例代碼

    這篇文章主要介紹了Redis實(shí)現(xiàn)訂單自動過期功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Redis跳躍表的基本原理和實(shí)現(xiàn)

    Redis跳躍表的基本原理和實(shí)現(xiàn)

    本文主要介紹了Redis跳躍表的基本原理和實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 利用yum安裝Redis的方法詳解

    利用yum安裝Redis的方法詳解

    Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。從2010年3月15日起,Redis的開發(fā)工作由VMware主持。這篇文章主要介紹的是利用yum安裝Redis的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧
    2016-11-11
  • Redis?Hash序列化存儲的問題及解決方案

    Redis?Hash序列化存儲的問題及解決方案

    這篇文章主要介紹了Redis?Hash序列化存儲的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論