Redis 數據類型 Zset 有序集合

有序集合相對于字符串、列表、哈希、集合來說會有?些陌?。它保留了集合不能有重復成員的特點,但與集合不同的是,有序集合中的每個元素都有?個唯?的浮點類型的分數(score)與之關
聯,著使得有序集合中的元素是可以維護有序性的,但這個有序不是?下標作為排序依據?是?這個分數。 有序集合中的元素是不能重復的,但分數允許重復。類?于?次考試之后,每個??定有? 個唯?的分數,但分數允許相同。

列表、集合、有序集合三者的異同點
數據結構
是否允許重復元素
是否有序有序依據
應?場景
列表
索引下標
時間軸、消息隊列等
集合
標簽、社交等
有序集合
分數
排?榜系統、社交等

特點

1.?元素唯一性:Zset 中的每個元素都是唯一的,不能重復。即使兩個元素的值相同,但分數(score)不同,它們也會被視為不同的元素。

2.?有序性:Zset 中的元素會根據其分數(score)自動排序。分數可以是任意的浮點數;默認情況下,Zset 按照分數從小到大排序,但也可以通過命令反轉排序方向;如果兩個元素的分數相同,則按照元素值的字典序排序。

3.?高效操作:Zset 支持高效的插入、刪除和查找操作,時間復雜度為 O(logN)。內部使用跳表(skiplist)或壓縮列表(ziplist)實現,對于小集合(默認 128 個元素以內),使用壓縮列表可以節省內存;對于大集合,跳表提供了高效的范圍查詢和排序功能。

內部編碼

1.?壓縮列表(ziplist):當有序集合滿足元素個數小于 128 并且每個元素的值的大小小于?64 字節時,Redis 使用 壓縮列表(ziplist) 作為內部編碼。壓縮列表通過緊湊的存儲方式減少內存占用,適合存儲小數據量的有序集合。

2.?跳表(skiplist):當有序集合不滿足壓縮列表的條件時(例如元素個數超過 128 或某個元素值大于 64 字節),Redis 會切換到 跳表(skiplist) 作為內部編碼。跳表是一種基于多級索引的有序鏈表結構,支持快速的范圍查詢和元素查找,時間復雜度為 O(logN)。跳表能夠動態調整索引層級,適應不同規模的數據,適合存儲大量數據的有序集合。

命令

ZADD

添加或者更新指定的元素以及關聯的分數到 zset 中,分數應該符合 double 類型,+inf/-inf 作為正負極限也是合法的。
語法:
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]
ZADD 的相關選項:
  • XX:僅僅?于更新已經存在的元素,不會添加新元素。
  • NX:僅?于添加新元素,不會更新已經存在的元素。
  • CH:默認情況下,ZADD 返回的是本次添加的元素個數,但指定這個選項之后,就會還包含本次更新的元素的個數。
  • INCR:此時命令類似 ZINCRBY 的效果,將元素的分數加上指定的分數。此時只能指定?個元素和分數。
時間復雜度:O(log(N))
返回值:本次添加成功的元素個數。
?例:

ZCARD

獲取?個 zset 的基數(cardinality),即 zset 中的元素個數。
語法:
ZCARD key
時間復雜度:O(1)
返回值:zset 內的元素個數。
?例:

ZCOUNT

返回分數在 min 和 max 之間的元素個數,默認情況下,min 和 max 都是包含的,可以通過 ( 排除。
語法:
ZCOUNT key min max
時間復雜度:O(log(N))
返回值:滿?條件的元素列表個數。
?例:

ZRANGE

返回指定區間?的元素,分數按照升序。帶上 WITHSCORES 可以把分數也返回。
語法:
ZRANGE key start stop [WITHSCORES]
時間復雜度:O(log(N)+M)
返回值:區間內的元素列表。
?例:

ZREVRANGE

返回指定區間?的元素,分數按照降序。帶上 WITHSCORES 可以把分數也返回。
語法:
ZREVRANGE key start stop [WITHSCORES]
時間復雜度:O(log(N)+M)
返回值:區間內的元素列表。
?例:

ZRANGEBYSCORE

返回分數在 min 和 max 之間的元素,默認情況下,min 和 max 都是包含的,可以通過 ( 排除。
語法:
ZRANGEBYSCORE key min max [WITHSCORES]
時間復雜度:O(log(N)+M)
返回值:區間內的元素列表。
?例:

ZPOPMAX

刪除并返回分數最?的 count 個元素。
語法:
ZPOPMAX key [count]
時間復雜度:O(log(N) * M)
返回值:分數和元素列表。
?例:

BZPOPMAX

ZPOPMAX 的阻塞版本。
語法:
BZPOPMAX key [key ...] timeout
時間復雜度:O(log(N))
返回值:元素列表。

ZPOPMIN

刪除并返回分數最低的 count 個元素。
語法:
ZPOPMIN key [count]
時間復雜度:O(log(N) * M)
返回值:分數和元素列表。
?例:

BZPOPMIN

ZPOPMIN 的阻塞版本。
語法:
BZPOPMIN key [key ...] timeout
時間復雜度:O(log(N))
返回值:元素列表。

ZRANK

返回指定元素的排名,升序。
語法:
ZRANK key member
時間復雜度:O(log(N))
返回值:排名。
?例:

ZREVRANK

返回指定元素的排名,降序。
語法:
ZREVRANK key member
時間復雜度:O(log(N))
返回值:排名。
?例:

ZSCORE

返回指定元素的分數。
語法:
ZSCORE key member
時間復雜度:O(1)
返回值:分數。
?例:

ZREM

刪除指定的元素。
語法:
ZREM key member [member ...]
時間復雜度:O(M*log(N))
返回值:本次操作刪除的元素個數。
?例:

ZREMRANGEBYRANK

按照排序,升序刪除指定范圍的元素,左閉右閉。
語法:
ZREMRANGEBYRANK key start stop
時間復雜度:O(log(N)+M)
返回值:本次操作刪除的元素個數。
?例:

ZREMRANGEBYSCORE

按照分數刪除指定范圍的元素,左閉右閉。
語法:
???????ZREMRANGEBYSCORE key min max
時間復雜度:O(log(N)+M)
返回值:本次操作刪除的元素個數。
?例:

ZINCRBY

為指定的元素的關聯分數添加指定的分數值。
語法:
ZINCRBY key increment member
時間復雜度:O(log(N))
返回值:增加后元素的分數。
?例:

ZINTERSTORE

求出給定有序集合中元素的交集并保存進?標有序集合中,在合并過程中以元素為單位進?合并,元素對應的分數按照不同的聚合?式和權重得到新的分數。
語法:
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
時間復雜度:O(N*K)+O(M*log(M)) N 是輸?的有序集合中, 最?的有序集合的元素個數; K 是輸?了?個有序集合; M 是最終結果的有序集合的元素個數.
返回值:?標集合中的元素個數
?例:

ZUNIONSTORE

求出給定有序集合中元素的并集并保存進?標有序集合中,在合并過程中以元素為單位進?合并,元素對應的分數按照不同的聚合?式和權重得到新的分數。
語法:
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
時間復雜度:O(N)+O(M*log(M)) N 是輸?的有序集合總的元素個數; M 是最終結果的有序集合的元素個數.
返回值:?標集合中的元素個數
?例:

使?場景

有序集合?較典型的使?場景就是排?榜系統。例如常?的?站上的熱榜信息,榜單的維度可能是多??的:按照時間、按照閱讀量、按照點贊量。本例中我們使?點贊數這個維度,維護每天的熱
榜:
1)添加??贊數
例如?? james 發布了?篇?章,并獲得 3 個贊,可以使?有序集合的 zadd 和 zincrby 功能:
zadd user:ranking:2025-02-14?3 james
之后如果再獲得贊,可以使? zincrby:
zincrby user:ranking:2022-03-15 1 james
2)取消??贊數
由于各種原因(例如??注銷、??作弊等)需要將??刪除,此時需要將??從榜單中刪除掉,可以使? zrem。例如刪除成員 tom:
zrem user:ranking:2025-02-14 tom
3)展?獲取贊數最多的 10 個??
此功能使? zrevrange 命令實現:
zrevrangebyrank user:ranking:2025-02-14 0 9
4)展???信息以及??分數
可以將??名作為鍵后綴,將??信息保存在哈希類型中,?于??的分數和排名可以使? zscore 和 zrank 來實現。
hgetall user:info:tom
zscore user:ranking:2025-02-14 mike
zrank user:ranking:2025-02-14 mike

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895550.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895550.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895550.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP 中的除以零錯誤

除以零錯誤&#xff08;Division by zero&#xff09;是指數字除以零的情況&#xff0c; 這在數學上是未定義的。在 PHP 中&#xff0c;處理這種錯誤的方式取決于 PHP 版本&#xff1a; PHP 7&#xff1a; 使用 / 運算符會產生一個警告 (E_WARNING) 并返回 false。 使用 intd…

基于springboot軌道交通安全評估系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 時代在飛速進步&#xff0c;每個行業都在努力發展現在先進技術&#xff0c;通過這些先進的技術來提高自己的水平和優勢&#xff0c;軌道交通安全評估管理當然不能排除在外。軌道交通安全評估系統是在實際應用和軟件工程的開發原理之上&#xff0c;運用Java語言以及Spring…

前端面試題目---頁面抖動的原因、如何避免、如何解決

前端頁面抖動是一個常見且影響用戶體驗的問題&#xff0c;下面將從抖動發生的場景、解決辦法以及預防措施三個方面進行詳細闡述。 頁面抖動發生的場景 1. 元素尺寸動態變化 圖片加載&#xff1a;當頁面中圖片的寬高沒有預先設定&#xff0c;在圖片加載完成后&#xff0c;其實…

vue知識點3

1.使用componenent的好處 符合高內聚&#xff0c;低耦合。一個組件出問題了&#xff0c;不會影響其他組件。 2.vue版本決定了一些使用框架的版本 vue2使用的路由版本只能到3 3.路由的配置介紹一下 a.安裝路由的插件 npm install vue-router3 b.整理文件路徑 將路徑整理…

如何測試和驗證CVE-2024-1430:Netgear R7000 路由器信息泄露漏洞分析

CVE-2024-1430 是一個影響 Netgear R7000 路由器的安全漏洞&#xff0c;漏洞來源于該路由器 Web 管理界面的信息泄露問題。攻擊者通過訪問 /currentsetting.htm 文件&#xff0c;可能泄露敏感信息&#xff0c;如 Wi-Fi 密碼等。 在測試和驗證 CVE-2024-1430 時&#xff0c;您需…

數據結構:哈夫曼樹

1.概念 哈夫曼樹&#xff08;Huffman Tree&#xff09;是一種用于數據壓縮的二叉樹&#xff0c;由大衛哈夫曼&#xff08;David A. Huffman&#xff09;于1952年提出。它通過構建最優二叉樹來實現數據的高效壓縮&#xff0c;廣泛應用于文件壓縮、圖像壓縮等領域。 哈夫曼樹的…

UE5.2后 Bake Out Materials失效

這個問題出現在5.3&#xff0c;5.4&#xff0c;5.5沒有測試 烘焙貼圖后會找不到貼圖位置&#xff0c; 這個是5.2的正常狀態 默認是生成在模型當前目錄里&#xff0c;包括新的材質 但是這個bug會讓材質和貼圖都消失&#xff0c;無法定位 暫時沒有辦法解決&#xff0c;等官方 …

ADC 的音頻實驗,無線收發模塊( nRF24L01)

nRF24L01 采用 QFN20 封裝&#xff0c;有 20 個引腳&#xff0c;以下是各引腳的詳細介紹&#xff1a; 1. 電源引腳 ? VDD&#xff1a;電源輸入端&#xff0c;一般接 3V 電源&#xff0c;為芯片提供工作電壓&#xff0c;供電電壓范圍為 1.9V&#xff5e;3.6V。 ? VSS&#xf…

基于HTML5 Canvas 和 JavaScript 實現的煙花動畫效果

以下是一個使用 HTML5 Canvas 和 JavaScript 實現的煙花動畫效果代碼盒子: <!DOCTYPE html> <html> <head><title>煙花效果

C++課程設計 運動會分數統計(含源碼)

C++課程設計 運動會分數統計 一、題目描述(一)問題描述(二)基本要求二、程序設計文檔1. 項目概述1.1 項目背景1.2 功能需求1.3 非功能需求2. 系統設計2.1 數據結構設計2.1.1 `School` 結構體2.1.2 `Project` 結構體2.2 功能模塊設計2.2.1 主菜單2.2.2 輸入/修改項目成績2.2…

【音視頻】RTSP拉流: RTP負載AAC詳解(三)

此文為系列文章&#xff0c;此系列主要講解RTSP客戶端的拉流及播放&#xff0c;文章持續更新&#xff0c;會從rtsp的基本協議講起&#xff0c;如何一步步實現音視頻的拉流過程&#xff0c;包括一系列涉及到的協議&#xff0c;rtsp&#xff0c;sdp&#xff0c; rtp&#xff08;本…

Dockerfiles 的 Top 10 常見 DevOps/SRE 面試問題及答案

1. RUN 和 CMD 之間有什么區別&#xff1f; RUN : 在鏡像構建過程中執行命令&#xff0c;創建一個新的層。通常用于安裝軟件包。 示例: RUN apt-get update && apt-get install -y curlCMD : 指定容器啟動時默認運行的命令。它在運行時執行&#xff0c;而不是在構建過程…

【ARM】JTAG接口介紹

1、 文檔目標 對 JTAG 接口有更多的認識&#xff0c;在遇到關于 JTAG 接口問題時有一些排查的思路。 2、 問題場景 在使用調試器過程時&#xff0c;免不了要接觸到 JTAG 接口&#xff0c;當出現連接不上時&#xff0c;就不知道從哪來進行排查。 3、軟硬件環境 1 軟件版本&am…

opencascade 獲取edge起始點 會出現終點與實際不同的情況

在使用 OpenCASCADE 獲取 TopoDS_Edge 的起始點和終點時&#xff0c;可能會出現終點與實際不一致的情況。這通常是由于以下原因導致的&#xff1a; 幾何曲線的方向問題&#xff1a;在某些情況下&#xff0c;幾何曲線的方向可能與拓撲邊的方向不一致&#xff0c;導致通過幾何曲線…

【電腦】u盤重裝win7

u盤必須8GB以上 1. CPU型號 首先查看CPU的型號看看到底能不能裝win7 2. 下載光盤映像文件 網址 看電腦是多少位的機器(32位下載x86 64位下載x64) 一共是這么多個版本按需下載對應的版本 電腦小白推薦無腦下載旗艦版 將鏈接復制到迅雷進行下載 3. 下載軟碟通 網址 下…

C++-AVL樹

一、AVL樹的概念 1.二叉搜索樹 二叉搜索樹&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;也稱二叉排序樹或二叉查找樹。 二叉搜索樹&#xff1a;一棵二叉樹&#xff0c;可以為空&#xff1b;如果不為空&#xff0c;滿足以下性質&#xff1a; 非空左子…

【網絡安全 | 漏洞挖掘】后端接受非預期參數的故事

未經許可,不得轉載。 文章目錄 正文正文 在對某項目進行測試時,我遵循了一套系統化的方法論,以確保全面理解其安全性。 首先,我創建了一個賬戶,并從用戶的角度探索主域及其各項功能。此階段,我避免使用 Burp Suite 或其他工具,而是嘗試真正理解該應用的設計邏輯與交互…

01.01、判定字符是否唯一

01.01、[簡單] 判定字符是否唯一 1、題目描述 實現一個算法&#xff0c;確定一個字符串 s 的所有字符是否全都不同。 在這一題中&#xff0c;我們的任務是判斷一個字符串 s 中的所有字符是否全都不同。我們將討論兩種不同的方法來解決這個問題&#xff0c;并詳細解釋每種方法…

w208基于spring boot物流管理系統設計與實現

&#x1f64a;作者簡介&#xff1a;多年一線開發工作經驗&#xff0c;原創團隊&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的網站項目。 代碼可以查看文章末尾??聯系方式獲取&#xff0c;記得注明來意哦~&#x1f339;贈送計算機畢業設計600個選題excel文…

《剛剛問世》系列初窺篇-Java+Playwright自動化測試-22- 操作鼠標拖拽 - 下篇(詳細教程)

1.簡介 上一篇中&#xff0c;宏哥說的宏哥在最后提到網站的反爬蟲機制&#xff0c;那么宏哥在自己本地做一個網頁&#xff0c;沒有那個反爬蟲的機制&#xff0c;谷歌瀏覽器是不是就可以驗證成功了&#xff0c;宏哥就想驗證一下自己想法&#xff0c;其次有人私信宏哥說是有那種…