Redis Set 類型常用操作命令之從基礎(chǔ)命令到實戰(zhàn)應(yīng)用
前言
在 Redis 的眾多數(shù)據(jù)結(jié)構(gòu)中,Set(集合)是一種非常有特色的類型。它與列表(List)類似,都可以存儲多個字符串元素,但 Set 具有兩個核心特性:元素的無序性和元素的唯一性。
- 無序性意味著 Set 中的元素沒有先后順序,{a, b, c} 和 {c, a, b} 被認(rèn)為是同一個集合。
- 唯一性確保了每個元素在集合中只會出現(xiàn)一次,這使得 Set 成為實現(xiàn)數(shù)據(jù)去重、統(tǒng)計獨立訪客(UV)等場景的天然選擇。
本文將深入探討 Redis Set 類型的常用操作命令,包括添加、刪除、查詢以及強(qiáng)大的交集、并集、差集運算,并結(jié)合實際應(yīng)用場景,展示 Set 在開發(fā)中的妙用。
1、集合中的元素是無序的
list[1,2,3]和[2,3,1]是兩個不用的list
set[1,2,3]和[2,3,1]是一個集合
2、集合中的元素是不能重復(fù)的(元素都是唯一的)
集合可以用來進(jìn)行去重
和list類似,集合中的每個類型,也都是string類型
可以使用JSON這樣的格式讓string也能存儲
sadd、smembers、sismember
sadd:將一個或者多個元素添加到set中,注意,重復(fù)的元素?zé)o法添加到set中的
這里的個體元素叫做member
時間復(fù)雜度是O(1)
sadd key member [member ...]
返回值就是本次操作成功添加了幾個元素

不能重復(fù)添加一個數(shù)

smembers:獲取一個set中的所有元素,注意,元素之間的順序是無序的
smembers key

sismember:判斷一個元素在不在set中,在的話就返回1,不在的話就返回了0
時間復(fù)雜度O(1)
sismember key member


spop、srandmember
正常的pop是刪除末尾元素的,我們這里是因為是集合中,無序的,所以spop是隨機(jī)刪除的
spop:從set中刪除并返回一個或者多個元素,注意,由于set內(nèi)的元素是無序的,所以取出的元素是隨機(jī)的
這里的count是要刪除幾個元素,不寫的話就是默認(rèn)刪除一個元素,寫的話就是刪除count個元素
spop key [count]

srandmember是從指定的集合中返回一個或者多個元素
srandmember key [count]

smove、srem
smove將一個元素從一個集合中取出并且放到另一個集合中去
smove source destination member
返回值1表示移動成功,0表示移動失敗
將member從source上刪除,然后插入到destination中

如果需要進(jìn)行移動的元素不存在的話會返回0的
srem:將制定的元素從set中刪除
srem key member [member...]
可以刪除一個member,也可以一次刪除多個member
返回值表示刪除元素的元素個數(shù)
sinter、sinterstore
交集(inster)、并集(union)、差集(diff)
交集:最終結(jié)果同時出現(xiàn)在兩個集合中
并集:把多個集合中的數(shù)據(jù)集中放在一起,如果元素有重復(fù),也最終只保留一份
差集:a和b作差集就是找出那些元素在a中存在,在b中不存在的
sinter:獲取給指定的一個集合或者是多個集合的交集
時間復(fù)雜度是O(N* M) N是最小的集合的元素個數(shù),M是最大的集合元素個數(shù)
sinter key [key ...]
返回值就是交集的元素

sinterstore :獲取指定的set的交集的元素并且保存到目標(biāo)的set中
直接將算好的交集,放到destination這個key對應(yīng)的集合中
sinterstore destination key [key ...]
返回值就是交集的元素個數(shù)
要想知道交集的內(nèi)容的話,我們直接按照訪問集合的方式訪問destination這個Key即可

sunion、sunionstore、sdiff、sdiffstore
sunion:獲取指定的set的并集中的元素
sunion key [key...]
返回值是并集的元素

sunionstore:獲取指定元素的并集并且放到destination中
sunionstore destination key [key...]

sdiff:獲取指定set的差集中的元素
sdiff key [key...]

sdiffstore:將指定set的差集中的元素獲取到destination中
sdiffstore destination key [key...]

命令總結(jié)
| 命令 | 時間復(fù)雜度 |
|---|---|
| sadd key element [element …] | O(k), k 是元素個數(shù) |
| srem key element [element …] | O(k), k 是元素個數(shù) |
| scard key | O(1) |
| sismember key element | O(1) |
| srandmember key [count] | O(n), n 是 count |
| spop key [count] | O(n), n 是 count |
| smembers key | O(k), k 是元素個數(shù) |
| sinter key [key …] sitnerstore | O(m * k), k 是幾個集合中元素最小的個數(shù), m 是鍵個數(shù) |
| sunion key [key …] sunionstore | O(k), k 是多個集合的元素個數(shù)總和 |
| sdiff key [key …] sdiffstore | O(k), k 是多個集合的元素個數(shù)總和 |
內(nèi)部編碼方式

set應(yīng)用場景
1、使用set來保存用戶的標(biāo)簽
2、set方便計算交集,很容易得找到兩個用戶之間的公共標(biāo)簽
使用set來計算用戶之間的共同好友
3、使用set統(tǒng)計UV
去重
總結(jié)
通過本文的學(xué)習(xí),我們?nèi)媪私饬?Redis 的 Set 數(shù)據(jù)類型。回顧一下關(guān)鍵知識點:
- 核心特性:Set 是一個無序且元素唯一的字符串集合。這一特性使其在需要去重和進(jìn)行集合運算的場景中表現(xiàn)出色。
- 基本操作:我們掌握了 sadd 添加、srem 刪除、smembers 查看所有成員、sismember 判斷成員是否存在等基礎(chǔ)命令,其中大部分操作都具有 O(1) 的高效時間復(fù)雜度。
- 集合運算:Set 最強(qiáng)大的功能之一是其高效的集合運算能力。通過 sinter (交集)、sunion (并集) 和 sdiff (差集) 命令,我們可以輕松實現(xiàn)復(fù)雜的數(shù)據(jù)分析和關(guān)聯(lián)查詢。
- 應(yīng)用場景:我們探討了 Set 在實際開發(fā)中的應(yīng)用,例如存儲用戶標(biāo)簽、計算共同好友/興趣、以及利用其唯一性進(jìn)行網(wǎng)站 UV 統(tǒng)計等。這些場景充分發(fā)揮了 Set 的優(yōu)勢。
總而言之,Redis Set 以其簡潔的數(shù)據(jù)模型和強(qiáng)大的運算能力,為處理許多常見業(yè)務(wù)問題提供了高效且優(yōu)雅的解決方案。
到此這篇關(guān)于Redis Set 類型詳解:從基礎(chǔ)命令到實戰(zhàn)應(yīng)用的文章就介紹到這了,更多相關(guān)Redis Set 類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Redis實現(xiàn)JWT令牌主動失效機(jī)制
JWT是一種輕量級的身份驗證和授權(quán)機(jī)制,它是一種 JSON 格式的數(shù)據(jù)串,通常用于客戶端和服務(wù)端之間的單點登錄(Single Sign-On, SSO)場景,本文給大家介紹了如何使用Redis來實現(xiàn)JWT令牌主動失效機(jī)制,需要的朋友可以參考下2024-08-08

