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

Redis中ZSet的具體使用

 更新時間:2022年07月18日 09:40:23   作者:北極星小王子  
本文主要介紹了Redis中ZSet的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、題目

ZSet能用在哪些場景?跳表查找的過程,時間復雜度

二、ZSet 簡單使用

舉個例子,fruit-price 是一個有序集合鍵,這個有序集合以水果名為成員,水果價錢為分值,保存了 130 款水果的價錢:

redis>ZADD fruit-price 5 "banana"
redis>ZADD fruit-price 6.5 "cherry"
redis>ZADD fruit-price 8 "apple"


redis> ZRANGE fruit-price 0 2 WITHSCORES
1) "banana"
2) "5"
3) "cherry"
4) 6.5
5) "apple"
6) "8"

redis> ZCARD fruit-price
(integer)130

三、ZSet 結(jié)構(gòu)

ZSet 結(jié)構(gòu)即支持單個元素查詢,又支持范圍查詢,是如何實現(xiàn)的呢?

Redis 中有兩種數(shù)據(jù)結(jié)構(gòu)來支持 ZSet 的功能,一個是字典 dict ,一個是 zskipList; 字典保存著從 member 到 score 的映射,跳躍表按 score 從小到大保存所有集合元素

先看下 ZSet 在代碼中的定義:

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

dict 各種編程語言中都有實現(xiàn)??梢员WC O(1) 的時間復雜度; 我們繼續(xù)看 zskiplist 的定義:

typedef struct zskiplist {
   struct zskiplistNode *header, *tail;
   unsigned long length;
   int level;
} zskiplist;

zskiplist 是 Redis 對 skiplist 做了變種,skiplist 就是我們常說的跳表;

四、跳躍表

跳躍表的特點

  • 由許多層結(jié)構(gòu)組成,每層都是一個有序鏈表
  • 最底層的鏈表包含所有元素
  • 如果一個元素出現(xiàn)在 level i 層的鏈表中,則它在 level i 之下的鏈表中也都會出現(xiàn)
  • 每個節(jié)點包含兩個指針,一個指向同一鏈表中的下一個元素,一個指向下面一層的元素

查找過程

  • 跳表的查找會從頂層鏈表的頭部元素開始遍歷該鏈表,直到找到元素大于或等于目標元素的節(jié)點,如果當前元素正好等于目標,那么就直接返回它;
  • 如果當前元素大于目標或到達鏈表尾部,則移動到前一個節(jié)點的位置,然后垂直下降到下一層;
  • 正因為 Skiplist 的搜索過程會不斷地從一層跳躍到下一層的,所以被稱為跳躍表;

舉例說明

假設(shè)鏈接包含 1-10,共 10 個元素。我們要找到第 9 個,需要從 header 遍歷,共 9 次才能找到:

在這里插入圖片描述

一次只能比較一個數(shù),最壞的情況下時間復雜度是 O(n),如果我們一次可以比較 2 個元素就好了:

在這里插入圖片描述

一次查找 2 個的話,我們只找了 5 次就找到了。所以就有了類似下面的結(jié)構(gòu),在鏈表上增加一層減少了元素個數(shù)的 “鏈表”:

在這里插入圖片描述

如果增加兩層 “鏈表”,只查找 3 次就可以找到:

在這里插入圖片描述

即便是我們找元素 8,也只需要遍歷 1 -> 4 -> 7 -> 8,共 4 次查詢;

這樣查找過程就非常類似于一個二分查找,使得查找的時間復雜度可以降低到 O(log n)

ZskipList 插入過程:

在這里插入圖片描述

從上面 Skiplist 的創(chuàng)建和插入過程可以看出,每一個節(jié)點的層數(shù)(level)是隨機出來的,而且新插入一個節(jié)點不會影響其它節(jié)點的層數(shù)。 因此,插入操作只需要修改插入節(jié)點前后的指針,而不需要對很多節(jié)點都進行調(diào)整。這就降低了插入操作的復雜度

Redis 初始化的時候,只判斷存儲的元素長度是否大于 64 個字節(jié)。大于 64 個字節(jié)選擇 Zkiplist,否則 Ziplist。當執(zhí)行增刪改查的方法,根據(jù)是 ziplist 還是 zkiplist 選擇不同的實現(xiàn)。只需要記住 zset,在兩種情況下使用 ziplist:

保存的元素個數(shù)不足 128 個;單個元素的大小超過 64 byte;

ziplist 編碼的有序集合使用緊挨在一起的壓縮列表節(jié)點來保存,第一個節(jié)點保存 member,第二個保存 score。ziplist 內(nèi)的集合元素按 score 從小到大排序,score 較小的排在表頭位置

為什么采用跳躍表

  • 跳表就是這樣的一種數(shù)據(jù)結(jié)構(gòu),結(jié)點是跳過一部分的,從而加快了查詢的速度。類似于 HashMap 中,Java 8 中當哈希沖突個數(shù)大于 7 個的時候,轉(zhuǎn)換為紅黑樹;
  • 跳表跟紅黑樹兩者的算法復雜度差不多,為什么 Redis 要使用跳表而不使用紅黑樹呢?跳表相對于紅黑樹,代碼簡單;
  • 如果我們要查詢一個區(qū)間里面的值,用平衡樹實現(xiàn)可能會麻煩。刪除一段區(qū)間時,如果是平衡樹,就會相當困難,畢竟涉及到樹的平衡問題,而跳表則沒有這種煩惱;

五、場景案例

1、信息統(tǒng)計

假設(shè)我們有某個班級所有學生的語文成績,想統(tǒng)計、查詢區(qū)間范圍、查詢單個學生成績、滿足高性能讀取這些需求, Redis 的 zset 結(jié)構(gòu)無疑是最好的選擇。Redis 提供了豐富的 API。示例

ZADD yuwen 90 s01 89 s03 99 s02 74 s04 97 s05

以 yuwen 為 key 分別存儲了 s01 到 s06 共計 6 名學生的分數(shù),我們可以查詢?nèi)我粚W生的成績:

ZSCORE yuwen s03

可以按照排序返回指定區(qū)間內(nèi)的所有元素

ZRANGE yuwen 1 2 withscores

可以訪問指定分數(shù)區(qū)間內(nèi)的所有元素

ZRANGEBYSCORE yuwen 90 100 withscores

可以統(tǒng)計指定區(qū)間內(nèi)的個數(shù)

ZCOUNT yuwen 80 90

2、排行榜

  • 經(jīng)常瀏覽技術(shù)社區(qū)的話,應該對 “1小時最熱門” 這類榜單不陌生。如何實現(xiàn)呢?如果記錄在數(shù)據(jù)庫中,不太容易對實時統(tǒng)計數(shù)據(jù)做區(qū)分;
  • 我們以當前小時的時間戳作為 zset 的 key,把貼子 ID 作為 member ,點擊數(shù)評論數(shù)等作為 score,當 score 發(fā)生變化時更新 score;
  • 利用 ZREVRANGE 或者 ZRANGE 查到對應數(shù)量的記錄;

到此這篇關(guān)于Redis中ZSet的具體使用的文章就介紹到這了,更多相關(guān)Redis ZSet使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis實現(xiàn)延遲任務的常見方案詳解

    Redis實現(xiàn)延遲任務的常見方案詳解

    延遲任務(Delayed?Task)是指在未來的某個時間點,執(zhí)行相應的任務,本文為大家整理了Redis實現(xiàn)延遲任務的幾個常見方案,希望對大家有所幫助
    2024-04-04
  • Web-ssrfme:redis 未授權(quán)訪問攻擊的問題解決

    Web-ssrfme:redis 未授權(quán)訪問攻擊的問題解決

    本文主要介紹了Web-ssrfme:redis 未授權(quán)訪問攻擊的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • Redis shake實現(xiàn)可視化監(jiān)控的示例代碼

    Redis shake實現(xiàn)可視化監(jiān)控的示例代碼

    Redis可視化監(jiān)控是通過監(jiān)控Redis服務器的各項指標和狀態(tài),并將其以可視化的方式展示給用戶,本文給大家介紹了Redis shake實現(xiàn)可視化監(jiān)控,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-03-03
  • redis 替代php文件存儲session的實例

    redis 替代php文件存儲session的實例

    這篇文章主要介紹了redis 替代php文件存儲session的實例的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這樣的方法,需要的朋友可以參考下
    2017-10-10
  • Redis哨兵模式介紹

    Redis哨兵模式介紹

    這篇文章介紹了Redis哨兵模式,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-02-02
  • Redis實現(xiàn)高并發(fā)計數(shù)器

    Redis實現(xiàn)高并發(fā)計數(shù)器

    這篇文章主要為大家詳細介紹了Redis實現(xiàn)高并發(fā)計數(shù)器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Redis模糊key查詢兩種方式總結(jié)

    Redis模糊key查詢兩種方式總結(jié)

    Redis作為一款高性能的鍵值存儲系統(tǒng),具有快速讀寫的特點,被廣泛應用于分布式緩存、消息隊列等領(lǐng)域,這篇文章主要給大家介紹了關(guān)于Redis模糊key查詢兩種方式的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • 深入理解Redis哈希槽

    深入理解Redis哈希槽

    Redis哈希槽是RedisCluster中實現(xiàn)數(shù)據(jù)分片和負載均衡的核心機制,本文就來介紹一下Redis哈希槽,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • Redis實戰(zhàn)之Jedis使用技巧詳解

    Redis實戰(zhàn)之Jedis使用技巧詳解

    Jedis?是老牌的?Redis?的?Java?客戶端,提供了比較全面的?Redis?命令的操作支持,也是目前使用最廣泛的客戶端。這篇文章主要為大家詳細介紹了Jedis的使用技巧,需要的可以參考一下
    2022-12-12
  • Redis跳躍表的基本原理和實現(xiàn)

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

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

最新評論

谷城县| 阿坝| 革吉县| 乐山市| 盘山县| 漳平市| 阿鲁科尔沁旗| 昭苏县| 龙川县| 恩施市| 和龙市| 高尔夫| 大竹县| 宁城县| 甘孜县| 海城市| 郧西县| 吴桥县| 南昌市| 当雄县| 读书| 桐庐县| 兴隆县| 保定市| 桃园市| 姜堰市| 沁阳市| 吐鲁番市| 汶川县| 温泉县| 麟游县| 土默特右旗| 治县。| 襄城县| 山西省| 隆德县| 思南县| 尼勒克县| 大城县| 德兴市| 太仓市|