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

Redis中的zset類型詳解

 更新時間:2023年08月24日 10:19:09   作者:指揮部在下面  
有序集合zset保留了set集合不能有重復(fù)成員的特點,但與set集合不同的是,zset的每個member都有一個唯一的浮點數(shù)類型的分?jǐn)?shù)score與之關(guān)聯(lián),這篇文章主要介紹了Redis的zset類型,需要的朋友可以參考下

什么是zset

有序集合zset保留了set集合不能有重復(fù)成員的特點,但與set集合不同的是,zset的每個member都有一個唯一的浮點數(shù)類型的分?jǐn)?shù)score與之關(guān)聯(lián)。依據(jù)每個member的score進(jìn)行排序。結(jié)構(gòu)如下圖所示:

image.png

有序集合中的元素是不能重復(fù)的,但分?jǐn)?shù)允許重復(fù)

常用命令

zadd

添加或更新指定元素以及關(guān)聯(lián)的分?jǐn)?shù)到zset中,分?jǐn)?shù)是double類型語法: zadd key [nx|xx] [gt|lt] [ch] [incr] score member [score member...]

  • nx:僅用于添加新元素,不能更新已經(jīng)存在的元素
  • xx:僅用于更新已經(jīng)存在的元素,不能添加新元素
  • gt:greater than 只能更新已經(jīng)存在并且分?jǐn)?shù)比現(xiàn)在的分?jǐn)?shù)高的元素,能正常添加元素
  • lt:less than 只能更新已經(jīng)存在并且分?jǐn)?shù)比現(xiàn)在分?jǐn)?shù)低的元素,能正常添加元素
  • ch:默認(rèn)情況,zadd返回的是本次添加元素的個數(shù),但指定這個選項后,還會包含本次更新的元素的個數(shù)
  • incr:將元素的分?jǐn)?shù)加上指定的分?jǐn)?shù),并且只能指定一個元素和分?jǐn)?shù)

我使用的版本是redis5,在redis5中不支持 gt/lt操作

時間復(fù)雜度:O(logN)

由于zset是有序結(jié)構(gòu),要求新增的元素,要放到合適的位置上即找位置的過程,zset內(nèi)部使用跳表的數(shù)據(jù)結(jié)構(gòu),可以達(dá)到O(logN)

image.png

:::dangerzset中的member和score不是鍵值對的關(guān)系,而是“pair”的關(guān)系,可以通過member找到score,也可以通過score找到member:::

zrange

查看zset中元素詳情語法: zrange key start stop 時間復(fù)雜度:O(logN+M)

首先根據(jù)下標(biāo)找到邊界值,找元素O(logN),從start位置開始遍歷到stop位置,O(m)

image.png

redis內(nèi)部存儲數(shù)據(jù)是按照二進(jìn)制存儲,所以redis服務(wù)器不負(fù)責(zé)“字符編碼”,因此需要redis客服端支持

添加 withscores 能查看每個元素對應(yīng)分?jǐn)?shù)

image.png

zset內(nèi)部默認(rèn)是按照升序的方式來排列的

zrevrange

返回指定區(qū)間元素,分?jǐn)?shù)按降序排列,帶上 withscores 可以將分?jǐn)?shù)加上語法: zrevrange key start stop [withscores] 時間復(fù)雜度:O(logN+M)

image.png

zcard

查看一共有幾個元素語法: zcard key 時間復(fù)雜度:O(1)

image.png

zcount

根據(jù)給定分?jǐn)?shù)區(qū)間查找有幾個元素語法: zcount key min max 閉區(qū)間時間復(fù)雜度:O(logN)

先根據(jù)min找到對應(yīng)元素,再根據(jù)max找到對應(yīng)元素,而查找元素的時間復(fù)雜度是O(logN),由于zset內(nèi)部記錄每個元素的“次序”,可以直接把max對應(yīng)元素的次序減去min對應(yīng)元素的次序即可,不需要進(jìn)行遍歷。

image.png

使用 ( 表示開區(qū)間

image.png

min和max可以寫成浮點數(shù),浮點數(shù)中inf表示無窮大,-inf表示負(fù)無窮大

image.png

zrangebyscore

返回分?jǐn)?shù)在min和max之間的元素語法: zrangebyscore key min max [withscores] 時間復(fù)雜度:O(logN+M)

image.png

在redis6以后該命令被廢棄,將功能合并到zrange中

zpopmax

刪除并返回分?jǐn)?shù)最高的count個元素,類似topk問題語法: zpopmax key [count] 時間復(fù)雜度:O(logN*M)

刪除M個元素,查找一個元素時間復(fù)雜度為O(logN)

返回值:返回分?jǐn)?shù)和元素列表

image.png

bzpopmax

zpopmax的阻塞版本語法: bzpopmax key [key...] timeout 時間復(fù)雜度:O(logN)返回值:返回元素列表

image.png

zpopmin

刪除并返回分?jǐn)?shù)最低的count個元素語法: zpopmin key [count] 時間復(fù)雜度:O(logN*M)返回值:返回分?jǐn)?shù)和元素列表

image.png

bzpopmin

zpopmin的阻塞版本語法: bzpopmin key [key...] timeout 時間復(fù)雜度:O(logN)返回值:返回元素列表

image.png

zrank

返回指定元素的次序,按升序排語法: zrank key member 時間復(fù)雜度:O(logN)返回值:返回對應(yīng)次序/下標(biāo)

image.png

zrevrank

zrank的降序版本語法: zrevrank key member 時間復(fù)雜度:O(logN)返回值:返回對應(yīng)元素次序/下標(biāo)

image.png

zscore

返回指定元素的分?jǐn)?shù)語法: zscore key member 時間復(fù)雜度:O(1)

在前面的命令中根據(jù)member找元素的時間復(fù)雜度都是O(logN),但是這里redis犧牲空間,換取時間做了特定的優(yōu)化

image.png

zrem

刪除指定元素語法: zrem key member [member...] 返回值:分?jǐn)?shù)

image.png

zremrangebyrank

根據(jù)下標(biāo)表示的范圍進(jìn)行刪除,閉區(qū)間語法: zremrangebyrank key start stop 時間復(fù)雜度:O(logN+M)

查找位置只需一次即可,然后刪除M個元素

返回值:返回刪除的個數(shù)

image.png

zremrangebyscore

刪除對應(yīng)的分?jǐn)?shù)范圍內(nèi)的元素語法: zremrangebyscore key min max 時間復(fù)雜度:O(logN+M)返回值:返回刪除個數(shù)

image.png

zincrby

修改元素的分?jǐn)?shù),并保持整個有序集合仍然是升序的語法: zincrby key increment member 時間復(fù)雜度:O(logN)返回值:增加后元素的分?jǐn)?shù)

image.png

zinterstore

將給定有序集合中元素的交集并保持到目標(biāo)有序集合中語法: zinterstore destination numkeys key [key...] [weights weight [weight ...]] [aggregate <sum|min|max>]

  • destination:把結(jié)果存儲到這個key
  • numkeys:整數(shù),描述后續(xù)有幾個key參與交集運(yùn)行
  • weights: 權(quán)重,有序集合帶有分?jǐn)?shù),此處指定的權(quán)重,相當(dāng)于一個系數(shù),會乘于當(dāng)前的分?jǐn)?shù)
  • aggregate:求并集時相同的元素的分?jǐn)?shù)是相加/取最小/取最大,默認(rèn)是相加

時間復(fù)雜度:O(NK)+O(Mlog(M)) -> O(M*logM)

N:輸入若干個有序集合中,元素最少的個數(shù)
K:有幾個有序集合
M:最終有序集合的元素個數(shù)
k一般不會太大,可以看作1,N和M接近,同一個數(shù)量級。
所以O(shè)(NK)+O(Mlog(M))->O(M)+O(Mlog(M))-> O(MlogM)

image.png

c:300.5+102=35
a:100.5+202=45

zunionstore

將給定有序集合中元素的并集并保存進(jìn)目標(biāo)有序集合中語法: zunionstore destination numkeys key [key...] [weights weight [weight...]][aggregate <sum|min|max>] 用法和 zinterstore 一致

image.png

內(nèi)部編碼

如果有序集合中的元素個數(shù)較少,或者各個元素體積較小使用 ziplist 來存儲,如果當(dāng)前元素個數(shù)比較多,或者各個元素體積非常大使用 skiplist 存儲

image.png

應(yīng)用場景

最關(guān)鍵的應(yīng)用場景就是排行榜系統(tǒng),例如微博熱搜,游戲天梯排行,成績排行

1.游戲天梯排汗

使用zset將玩家信息和對應(yīng)分?jǐn)?shù)存入即可,就會自動生成一個排行榜,可以使用 zrevrange 取出前幾名玩家。當(dāng)分?jǐn)?shù)發(fā)生改變,可以使用 zincrby 修改分?jǐn)?shù),排行順序能自動調(diào)整。

2.微博熱搜

微博熱搜需要考慮到瀏覽量,點贊量,轉(zhuǎn)發(fā)量,評論量等,需要使用權(quán)重 weights ,此時可以使用 zinterstore/zunionstore 按照加權(quán)的方式處理??梢詫⒚總€維度的數(shù)值放到有序集合中, member 就是微博id, score 就是各個維度的數(shù)值。通過 zinterstore/zunionstore 把上述有序集合按照約定的權(quán)重,進(jìn)行集合間運(yùn)算即可。

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

相關(guān)文章

  • Redis之sql緩存的具體使用

    Redis之sql緩存的具體使用

    本文主要介紹了Redis之sql緩存的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Redis中Hash函數(shù)的12種用法詳解

    Redis中Hash函數(shù)的12種用法詳解

    在Redis中,Hash(哈希)類型 是存儲對象屬性的黃金方案,無論是用戶信息、商品庫存,還是配置參數(shù),Hash都能以 O(1) 的時間復(fù)雜度 實現(xiàn)高效讀寫,本文將通過 12種Hash函數(shù),結(jié)合 Java代碼+Redis命令,帶你從零到精通,需要的朋友可以參考下
    2025-09-09
  • Redis和數(shù)據(jù)庫 數(shù)據(jù)同步問題的解決

    Redis和數(shù)據(jù)庫 數(shù)據(jù)同步問題的解決

    這篇文章主要介紹了Redis和數(shù)據(jù)庫 數(shù)據(jù)同步問題的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 淺談Redis中的緩存更新策略

    淺談Redis中的緩存更新策略

    這篇文章主要介紹了淺談Redis中的緩存更新策略,CacheAsidePatter是我們比較常用的緩存更新策略,其由緩存調(diào)用者在更新數(shù)據(jù)庫時,在業(yè)務(wù)邏輯中設(shè)置緩存更新,需要的朋友可以參考下
    2023-08-08
  • 詳解Redis中數(shù)值亂碼的根本原因以及解決方式

    詳解Redis中數(shù)值亂碼的根本原因以及解決方式

    這篇文章給大家詳細(xì)分析了Redis中數(shù)值亂碼的根本原因以及解決方式,通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • redis集群搭建_動力節(jié)點Java學(xué)院整理

    redis集群搭建_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了redis集群搭建,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Linux系統(tǒng)下安裝Redis數(shù)據(jù)庫過程

    Linux系統(tǒng)下安裝Redis數(shù)據(jù)庫過程

    大家好,本篇文章主要講的是Linux系統(tǒng)下安裝Redis數(shù)據(jù)庫過程,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 為什么斷電后Redis數(shù)據(jù)不會丟失

    為什么斷電后Redis數(shù)據(jù)不會丟失

    Redis 作為一款內(nèi)存數(shù)據(jù)庫,被廣泛使用于緩存,分布式鎖等場景,那么假如斷電或者因其他因素導(dǎo)致 Reids 服務(wù)宕機(jī),在重啟之后數(shù)據(jù)會丟失嗎?本文就來介紹與一下
    2021-08-08
  • 基于Redis過期事件實現(xiàn)訂單超時取消

    基于Redis過期事件實現(xiàn)訂單超時取消

    這篇文章主要介紹了基于Redis過期事件實現(xiàn)訂單超時取消,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Redis全量復(fù)制與部分復(fù)制示例詳解

    Redis全量復(fù)制與部分復(fù)制示例詳解

    這篇文章主要給大家介紹了關(guān)于Redis全量復(fù)制與部分復(fù)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Redis爬蟲具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論

高雄市| 中阳县| 二手房| 屏山县| 乌兰察布市| 阳江市| 华亭县| 邯郸县| 上虞市| 合川市| 龙胜| 绩溪县| 罗江县| 陆丰市| 商丘市| 龙里县| 黎城县| 寻甸| 锡林郭勒盟| 滨海县| 洞头县| 德兴市| 南靖县| 金坛市| 南皮县| 平安县| 兴宁市| 晋城| 荔波县| 新乡市| 新和县| 敦煌市| 通河县| 木里| 荣昌县| 西藏| 黄石市| 镇康县| 突泉县| 阳江市| 玛沁县|