Redis 中 Set 和 Zset 類型

目錄

1.Set類型

1.1 Set集合

1.2 普通命令

1.3 集合操作

1.4 內部編碼

1.5 使用場景

2.Zset類型

2.1 Zset有序集合

2.2 普通命令

2.3 集合間操作

2.4 內部編碼

2.5 使用場景


1.Set類型

1.1 Set集合

集合類型也是保存多個字符串類型的元素,但是和列表類型不同的是,集合中的元素是無序的,并且不允許重復,Redis除了支持集合內的增刪改查操作,同時還支持多個集合取交集、并集、差集

集合類型

1.2 普通命令

SADD

將一個或者多個元素添加到set中,重復的元素無法添加到set中

語法:

SADD key member [member ...]

時間復雜度:O(1)

返回值:添加成功的元素個數

SMEMBERS

獲取一個 set 中的所有元素,元素之間的順序是無序的

語法:

SMEMBERS key

時間復雜度:O(N)

返回值:所有元素的列表?

SISMEMBER

判斷一個元素在不在 set 中

語法:

SISMEMBER key member

時間復雜度:O(1)

返回值:1表示元素在 set 中,0表示不在 set 中或者 key 不存在

SCARD

獲取 set 中元素的個數

語法:

SCARD key

時間復雜度:O(1)

返回值:set 內元素的個數

SPOP

從 set 中刪除并返回一個或者多個元素,由于 set 中元素是無序的,所以取出的元素是隨機的

語法:

SPOP key [count]

count代表個數,不寫表示隨機刪除一個,寫的時候,寫幾個就刪除幾個

時間復雜度:O(N),N為count

返回值:取出的元素

SMOVE

將一個元素從源 set 取出并放入目標 set 中

語法:

SMOVE source destination member

時間復雜度:O(1)

返回值:1表示成功,0表示失敗

如果繼續給key1里面添加一個1,然后再把這個1移動到key2,smove也會按照刪除插入執行

SREM

將指定的元素從 set 中刪除

語法:

SREM key member [member ...]

時間復雜度:O(N),N為要刪除元素的個數

返回值:刪除元素的個數

1.3 集合操作

交集(inter)、并集(union)、差集(diff)

SINTER

獲取給定 set 的交集中的元素

語法:

SINTER key [key ...]

時間復雜度:O(N * M),N是最小的集合元素個數,M是最大的集合元素個數

返回值:交集的元素

SINTERSTORE

獲取給定 set 的交集中的元素并保存到目標 set 中

語法:

SINTERSTORE destination key [key ...]

時間復雜度:O(N * M),N是最小的集合元素個數,M是最大的集合元素個數

返回值:交集的元素個數

SUNION

獲取給定 set 的并集中的元素

語法:

SUNION key [key ...]

時間復雜度:O(N),N為給定所有集合的總的元素個數

返回值:并集的元素

SUNIONSTORE

獲取給定 set 的并集中的元素并保存到目標 set 中

語法:

SUNIONSTORE destination key [key ...]

時間復雜度:O(N),N為給定所有集合的總的元素個數

返回值:并集的元素個數

SDIFF

獲取給定 set 的差集中的元素

語法:

SDIFF key [key ...]

時間復雜度:O(N),N為給定的所有集合的總的元素個數

返回值:差集的元素

SDIFFSTORE

獲取給定 set 的差集中的元素并保存到目標 set 中

語法:

SDIFFSTORE destination key [key ...]

時間復雜度:O(N),N為給定的所有集合的總的元素個數

返回值:差集的元素個數

1.4 內部編碼

集合類型的內部編碼有兩種:

1)intset(整數集合):當集合中的元素都是整數并且元素格式小于?set-max-intset-entries 配置(默認512個)時,Redis會選用 intset 來作為集合的內部實現,從而減少內存的使用

2)hashtable(哈希表):當集合類型無法滿足 intset 的條件時,Redis會使用hashtable作為集合的內部實現

當元素個數較少并且都為整數時,內部編碼為 intset:

當元素不是整數時,內部編碼為 hashtable:

1.5 使用場景

1)標簽

集合類型比較典型的使用場景是標簽,例如A用戶對娛樂、體育感興趣,B用戶對游戲、綜藝感興趣,這些興趣點可以被抽象成標簽

給用戶添加標簽

sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4

給標簽添加用戶

sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
...
sadd tagk:users user:1 user:4 user:9 user:28

刪除用戶下的標簽?

srem user:1:tags tag1 tag5
...

刪除標簽下的用戶

srem tag1:users user:1
srem tag5:users user:1
...

計算用戶的共同興趣標簽

sinter user:1:tags user:2:tags

2)使用 set 計算用戶之間的共同好友

對兩個用戶的好友總數取交集

3)使用 set 統計 UV

PV:表示用戶每次訪問服務器,都會產生一個PV

UV:表示每個用戶訪問服務器,都會產生一個UV,但是同一個用戶多次訪問,不會增加UV

2.Zset類型

2.1 Zset有序集合

有序集合中可以存在重復的元素,與集合不同的是,有序集合中的每個元素都有一個唯一的浮點類型的分數(score)與之關聯,使得有序集合中的元素是可以維護有序性的,在進行排序的時候就是根據分數(score)的大小來說進行升序/降序排序

列表、集合、有序集合三者的異同點

2.2 普通命令

ZADD

添加或者更新指定元素以及關聯的分數到zset中,分數應該符合double類型

NX:用于添加新元素,不會更新已經存在的元素

XX: 用于更新已經存在的元素,不會添加新元素

CH:默認情況下,ZADD返回的是本次添加元素的個數,指定這個選項之后,就會包含本次更新元素的個數

INCR:將元素的分數加上指定的分數,此時只能指定一個元素和分數

語法:

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member
...]

時間復雜度:O(logN)

返回值:本次添加成功的元素個數

注意:hash、set、list很多時候添加一個元素的時間復雜度都是O(1),由于zset是有序結構,它要為新添加的元素取尋找合適的位置,之所以是logN不是N,是因為zset內部的數據結構是跳表

實際上zset內部就是按照升序的方式來排序的,如果兩個元素的分數相同,就按照字符串的字典序來進行排序

如果修改了分數,影響了之前的順序,就會自動移動元素位置,保持升序的順序不變,此處只修改沒有添加返回值就是0

添加新的元素,此處的返回值就是1

加上ch這個選項,更新元素之后,返回值就是更新元素的個數

給元素加上指定的分數,返回值就是最終的分數,只能指定一個元素和分數

ZCARD

獲取一個zset中元素的個數

語法:

ZCARD key

時間復雜度:O(1)

返回值:zset內的元素個數

ZCOUNT

返回分數在 min 和 max 之間的元素個數,默認情況下,min 和 max 都是包含,可以通過 ( 排除

語法:

ZCOUNT key min max

時間復雜度:O(logN)

zcount先根據 min 找到對應的元素, 再根據 max 找到對應的元素,zset 會記錄每個元素當前的次序,查詢到元素,就知道了元素的次序,然后直接把 max 對應的元素和 min 對應的元素次序做減法

返回值:滿足條件的元素列表個數

包含 50 和 77

排除 50 和 77

ZRANGE

返回指定區間的元素,分數按照升序,加上 WITHSCORES 可以把分數也返回

語法:

ZRANGE key start stop [WITHSCORES]

時間復雜度:O(logN + M)

此處要根據次序(下標)找到邊界值,時間復雜度就是zcount的時間復雜度O(logN),而 M 是 start? 和 stop之間的元素個數

返回值:區間內的元素列表?

ZREVRANGE

返回指定區間的元素,分數按照降序

語法:

ZREVRANGE key start stop [WITHSCORES]

時間復雜度:O(logN)

返回值:區間內的元素列表?

ZRANGEBYSCORE

返回分數在 min 和 max 之間的元素,默認情況 min 和 max 都是包含的,可以通過 ( 排除

語法:

ZRANGEBYSCORE key min max [WITHSCORES]

時間復雜度:O(logN + M)

返回值:區間內的元素列表

ZPOPMAX

刪除并返回分數最高的 count 個元素?

語法:

ZPOPMAX key [count]

時間復雜度:O(logN * M)

N 是有序集合的元素個數,M 是要刪除元素的個數,count 不寫表示刪除一個,寫幾就刪除幾個

返回值:分數和元素列表

BZPOPMAX

ZPOPMAX 的阻塞版本?

語法:

BZPOPMAX key [key ...] timeout

時間復雜度:O(logN)

時間復雜度是 logN,是因為從 key 上面只刪除了一次元素

返回值:元素列表

ZPOPMIN

刪除并返回分數最低的 count 個元素

語法:

ZPOPMIN key [count]

時間復雜度:O(logN * M)

返回值:分數和元素列表

BZPOPMIN

ZPOPMIN的阻塞版本

語法:

BZPOPMIN key [key ...] timeout

時間復雜度:O(logN)

返回值:元素列表

ZRANK

返回指定元素的排名,升序

語法:

ZRANK key member

時間復雜度:O(logN)

返回值:排名

ZREVRANK

返回指定元素的排名,降序

語法:

ZREVRANK key member

時間復雜度:O(logN)

返回值:排名

ZSCORE

返回指定元素的分數

語法:

ZSCORE key member

時間復雜度:O(1)

返回值:分數

ZREM

刪除指定的元素

語法:

ZREM key member [member ...]

時間復雜度:O(logN * M)

N 是整個有序集合中元素個數,M 是 member 的個數

返回值:刪除元素的個數

ZREMRANGEBYRANK

按照排序,升序刪除指定范圍的元素,左閉右閉

語法:

ZREMRANGEBYRANK key start stop

時間復雜度:O(logN + M)

N 是整個有序幾個的元素個數,M 是 start - stop 區間中元素的個數,此處只需要進行一次查找

返回值:刪除元素的個數

ZREMRANGEBYSCORE

按照分數刪除指定范圍的元素,左閉右閉

語法:

ZREMRANGEBYSCORE key min max

時間復雜度:O(logN + M)

返回值:刪除元素的個數

ZINCRBY

為指定的元素加上指定的分數

語法:

ZINCRBY key increment member

時間復雜度:O(logN)

由于增加后的元素可能會改變原有的位置,此時需要保證有序集合中的元素仍然是升序的,因此時間復雜度為 logN

返回值:增加后元素的分數

2.3 集合間操作

ZINTERSTORE

求出給定有序集合中元素并保存到目標集合中,在合并過程中以元素為單位進行合格,元素對應的分數按照不同的聚合方式和權重重新得到新的分數

語法:

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>]

destination:要把結果存儲到哪個 key 對應的 zset 中

numkeys:整數,表示有幾個 key 參與交集運算?,前面的命令中不涉及到 numkeys,此處涉及到numkeys是為了明確知道后面的選項從哪開始了(類似面向字節流的粘包問題),如果沒有這個整數,就無法知道有幾個 key 參與

weight:權重

sum: 求和? ? ? ? min:取最小? ? ? ? max:取最大

時間復雜度:O(N * K) + O(logN * M)

N是輸入的有序集合中最小的有序集合的元素個數,K表示幾個有序集合,M是最終結果的有序集合的元素個數

返回值:目標集合中的元素個數

對 key1 * 2,key2 * 3之后,再將他們相加,得到最終結果

對 key1 和 key2 求交集,取最小值

對 key1 和 key2 求交集,取最大值?

在有序集合中,member 才是元素的本體,而 score 只是輔助的,因此,在進行求交集時,只要 member相同就行

ZUNIONSTORE

求出給定有序集合中元素的并集并保存到目標有序集合中,在合并的過程中以元素為單位進行合并,元素對應的分數按照不同的聚合方式和權重得到新的分數

語法:

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>]

時間復雜度:O(N) + O(logN * M)

N是輸入的有序集合總的元素個數,M是最終結果的有序集合的元素個數

返回值:目標集合中的元素個數

2.4 內部編碼

?1)當元素個數較少且每個元素較小時,內部編碼為 ziplist:

2)當元素個數超過128個,內部編碼為 skiplist:

127.0.0.1:6379> ZADD key2 10 kkkkkk......

2.5 使用場景

1)添加用戶贊數

例如 A 用戶發布了一篇文章,獲得了 3 個贊,此時就可以使用有序集合中的 ZADD 和 ZINCRBY

zadd user:ranking 3 A

后續再獲得贊數,可以使用 ZINCRBY 了

zincrby user:ranking 1 A

2)取消用戶贊數

如果用戶注銷,此時就可以把用戶從榜單上刪除,可以使用 ZREM

zrem user:ranking A

3) 展示用戶信息以及用戶分數

例如將用戶的信息(姓名、年齡)保存再哈希類型中,先獲取用戶的 name ,再根據 name 去查用戶的分數和排名

存儲用戶的信息

HSET user:info name A age 19

獲取用戶的信息

HGETALL user:info

此時就獲取到了用戶的 name 和 age,再根據 name 去查詢用戶的分數和排名

ZSCORE?user:ranking A

ZRANK?user:ranking A

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

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

相關文章

【Go】excelize庫實現excel導入導出封裝(四),導出時自定義某一列或多列的單元格樣式

大家好&#xff0c;這里是符華~ 查看前三篇&#xff1a; 【Go】excelize庫實現excel導入導出封裝&#xff08;一&#xff09;&#xff0c;自定義導出樣式、隔行背景色、自適應行高、動態導出指定列、動態更改表頭 【Go】excelize庫實現excel導入導出封裝&#xff08;二&…

WY-35A4T三相電壓繼電器 導軌安裝 約瑟JOSEF

功能簡述 WY系列電壓繼電器是帶延時功能的數字式交流電壓繼電器。 可用于發電機&#xff0c;變壓器和輸電線的繼電保護裝置中&#xff0c;作為過電壓或欠電壓閉鎖的動作元件 LCD實時顯示當前輸入電壓值 額定輸入電壓Un:100VAC、200VAC、400VAC產品滿足電磁兼容四級標準 產品…

【Rust入門】猜數游戲

文章目錄 前言Rust的變量Rust占位符讀取一行數據到變量里面示例代碼總結 前言 Rust是一種系統編程語言&#xff0c;它專注于速度、內存安全和并行性。學習Rust可以為你的編程技能庫增添新的一筆。在這篇文章中&#xff0c;我們將通過一個簡單的猜數游戲來介紹Rust的基本概念。…

VBA初學:零件成本統計之一(任務匯總)

經過前期一年多對金蝶K3生產任務流程和操作的改造和優化&#xff0c;現在總算可以將零件加工各個環節的成本進行歸集了。 原本想寫存儲過程&#xff0c;通過直接SQL報表做到K3中去的&#xff0c;但財務原本就是用EXCEL&#xff0c;可以方便調整和保存&#xff0c;加上還有一部分…

便攜式氣象站:探索自然的智慧伙伴

在探索自然奧秘、追求科學真理的道路上&#xff0c;氣象數據始終是我們不可或缺的指引。然而&#xff0c;傳統的氣象站往往龐大而笨重&#xff0c;難以在偏遠地區或移動環境中靈活部署。 便攜式氣象站&#xff0c;顧名思義&#xff0c;是一種小巧輕便、易于攜帶和安裝的氣象觀測…

模擬面試002-Java開發工程師+簡歷+問題+回答

模擬面試002-Java開發工程師簡歷問題回答 目錄 模擬面試002-Java開發工程師簡歷問題回答面試簡歷面試官題問Java基礎與編程框架與工具數據庫與性能優化項目經驗與實踐團隊合作與溝通 求職者回答Java基礎與編程框架與工具數據庫與性能優化項目經驗與實踐團隊合作與溝通 參考資料…

由于找不到xinput1 3.dll無法繼續執行重新安裝程序

如果您的計算機提示無法找到xinput1_3.dll文件&#xff0c;這可能表明您的計算機存在問題。在這種情況下&#xff0c;您需要立即對xinput1_3.dll文件進行修復&#xff0c;否則您的某些程序將無法啟動。以下是解決無法找到xinput1_3.dll文件的方法。 一、關于xinput1_3.dll文件的…

你要允許此應用對你的設備進行更改嗎

在Windows 11中&#xff0c;當你看到提示“你要允許此應用對你的設備進行更改嗎&#xff1f;”時&#xff0c;這是系統檢測到某個應用或軟件試圖對你的設備進行更改或安裝的提醒。這個提示是為了保護你的系統免受潛在惡意軟件的侵害。如果你選擇“是”&#xff0c;則應用可以繼…

Elasticsearch 實現 Word、PDF,TXT 文件的全文內容提取與檢索

文章目錄 一、安裝軟件:1.通過docker安裝好Es、kibana安裝kibana:2.安裝原文檢索與分詞插件:之后我們可以通過doc命令查看下載的鏡像以及運行的狀態:二、創建管道pipeline名稱為attachment二、創建索引映射:用于存放上傳文件的信息三、SpringBoot整合對于原文檢索1、導入依賴…

安全及應用(更新)

一、賬號安全 1.1系統帳號清理 #查看/sbin/nologin結尾的文件并統計 [rootrootlocalhost ~]# grep /sbin/nologin$ /etc/passwd |wc -l 40#查看apache登錄的shell [rootrootlocalhost ~]# grep apache /etc/passwd apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin#改變…

Android增量更新----java版

一、背景 開發過程中&#xff0c;隨著apk包越來越大&#xff0c;全量更新會使得耗時&#xff0c;同時浪費流量&#xff0c;為了節省時間&#xff0c;使用增量更新解決。網上很多文章都不是很清楚&#xff0c;沒有手把手教學&#xff0c;使得很多初學者&#xff0c;摸不著頭腦&a…

2011年的數字IC設計面經

2011年老羅寫的面經&#xff0c;轉眼間2024年了&#xff0c;大家湊合著看吧&#xff0c;可以順便看看2011年的應屆生薪資。 本人通信工程碩士&#xff0c;非電子科班出身&#xff0c;主要找數字IC設計的工作&#xff0c;找工作找了一個月左右&#xff0c;還算滿意吧&#xff0…

邊緣概率密度、條件概率密度、邊緣分布函數、聯合分布函數關系

目錄 二維隨機變量及其分布離散型隨機變量連續型隨機變量邊緣分布邊緣概率密度舉例邊緣概率密度 條件概率密度邊緣概率密度與條件概率密度的區別邊緣概率密度條件概率密度舉個具體例子 參考資料 二維隨機變量及其分布 離散型隨機變量 把所有的概率&#xff0c;都理解成不同質量…

R迅速切換目錄 -R語言002

實用小操作系列 R定位當前目錄 getwd() [1] "/data/Rprofile1" #當前工作目錄&#xff0c;因為他讀取文件都是相對路徑&#xff0c;進當前目錄&#xff0c;一般不考慮絕對路徑&#xff0c;寫代碼容易亂呀&#xff0c;切目錄最簡單完善 R切換工作目錄 setwd(&q…

邏輯圖框架圖等結構圖類圖的高效制作方式不妨進來看看

**邏輯圖框架圖等結構圖類圖的高效制作方式不妨進來看看** 基于我們每天都在處理大量的數據和信息。為了更清晰地理解和傳達這些信息&#xff0c;結構圖、邏輯圖和框架圖等可視化工具變得越來越重要。然而&#xff0c;如何高效地制作這些圖表并確保其準確性和易讀性呢&#xf…

RedHat運維-LinuxSELinux基礎4-端口綁定SELinux上下文

1. SELinux將一個_________與一個SELinux上下文相連接&#xff1b; 2. SSH協議將22/tcp端口與__________SELinux上下文相聯系&#xff1b; 3. HTTP協議將80/tcp、443/tcp端口與____________SELinux上下文相聯系&#xff1b; 4. 列出所有端口的SELinux上下文信息的方法是_______…

Mongodb索引簡介

學習mongodb&#xff0c;體會mongodb的每一個使用細節&#xff0c;歡迎閱讀威贊的文章。這是威贊發布的第84篇mongodb技術文章&#xff0c;歡迎瀏覽本專欄威贊發布的其他文章。如果您認為我的文章對您有幫助或者解決您的問題&#xff0c;歡迎在文章下面點個贊&#xff0c;或者關…

Windows密碼憑證獲取

Windows HASH HASH簡介 hash &#xff0c;一般翻譯做散列&#xff0c;或音譯為哈希&#xff0c;所謂哈希&#xff0c;就是使用一種加密函數進行計算后的結果。這個 加密函數對一個任意長度的字符串數據進行一次數學加密函數運算&#xff0c;然后返回一個固定長度的字符串。…

常用字符集與亂碼原因

1.ASCII字符集&#xff1a;僅對英文字符編碼&#xff0c;每個字符用1B編碼&#xff0c;7位二進制足以表示所有ASCII字符集&#xff0c;因此最高位始終為0 2.GBK字符集&#xff1a;GB2312字符集&#xff08;簡體中文字符集&#xff09;BIG5字符集&#xff08;臺灣地區繁體中文字…

服裝購物商城系統小程序-計算機畢業設計源碼35058

摘要 服裝購物商城系統小程序&#xff0c;依托Spring Boot框架的強大支持&#xff0c;為用戶呈現了一個功能豐富、體驗流暢的在線購物平臺。該系統不僅涵蓋了商品展示、用戶注冊登錄、購物車管理、訂單處理、支付集成等核心購物流程&#xff0c;還引入了個性化推薦算法&#xf…