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

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

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

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


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

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

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

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

sinterstore :獲取指定的set的交集的元素并且保存到目標(biāo)的set中
直接將算好的交集,放到destination這個(gè)key對應(yīng)的集合中
sinterstore destination key [key ...]
返回值就是交集的元素個(gè)數(shù)
要想知道交集的內(nèi)容的話,我們直接按照訪問集合的方式訪問destination這個(gè)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é)
| 命令 | 時(shí)間復(fù)雜度 |
|---|---|
| sadd key element [element …] | O(k), k 是元素個(gè)數(shù) |
| srem key element [element …] | O(k), k 是元素個(gè)數(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 是元素個(gè)數(shù) |
| sinter key [key …] sitnerstore | O(m * k), k 是幾個(gè)集合中元素最小的個(gè)數(shù), m 是鍵個(gè)數(shù) |
| sunion key [key …] sunionstore | O(k), k 是多個(gè)集合的元素個(gè)數(shù)總和 |
| sdiff key [key …] sdiffstore | O(k), k 是多個(gè)集合的元素個(gè)數(shù)總和 |
內(nèi)部編碼方式

set應(yīng)用場景
1、使用set來保存用戶的標(biāo)簽
2、set方便計(jì)算交集,很容易得找到兩個(gè)用戶之間的公共標(biāo)簽
使用set來計(jì)算用戶之間的共同好友
3、使用set統(tǒng)計(jì)UV
去重
總結(jié)
通過本文的學(xué)習(xí),我們?nèi)媪私饬?Redis 的 Set 數(shù)據(jù)類型?;仡櫼幌玛P(guān)鍵知識點(diǎn):
- 核心特性:Set 是一個(gè)無序且元素唯一的字符串集合。這一特性使其在需要去重和進(jìn)行集合運(yùn)算的場景中表現(xiàn)出色。
- 基本操作:我們掌握了 sadd 添加、srem 刪除、smembers 查看所有成員、sismember 判斷成員是否存在等基礎(chǔ)命令,其中大部分操作都具有 O(1) 的高效時(shí)間復(fù)雜度。
- 集合運(yùn)算:Set 最強(qiáng)大的功能之一是其高效的集合運(yùn)算能力。通過 sinter (交集)、sunion (并集) 和 sdiff (差集) 命令,我們可以輕松實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)分析和關(guān)聯(lián)查詢。
- 應(yīng)用場景:我們探討了 Set 在實(shí)際開發(fā)中的應(yīng)用,例如存儲用戶標(biāo)簽、計(jì)算共同好友/興趣、以及利用其唯一性進(jìn)行網(wǎng)站 UV 統(tǒng)計(jì)等。這些場景充分發(fā)揮了 Set 的優(yōu)勢。
總而言之,Redis Set 以其簡潔的數(shù)據(jù)模型和強(qiáng)大的運(yùn)算能力,為處理許多常見業(yè)務(wù)問題提供了高效且優(yōu)雅的解決方案。
到此這篇關(guān)于Redis Set 類型詳解:從基礎(chǔ)命令到實(shí)戰(zhàn)應(yīng)用的文章就介紹到這了,更多相關(guān)Redis Set 類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis 中的熱點(diǎn)鍵和數(shù)據(jù)傾斜示例詳解
熱點(diǎn)鍵是指在 Redis 中被頻繁訪問的特定鍵,這些鍵由于其高訪問頻率,可能導(dǎo)致 Redis 服務(wù)器的性能問題,尤其是在高并發(fā)場景下,本文給大家介紹Redis 中的熱點(diǎn)鍵和數(shù)據(jù)傾斜,感興趣的朋友一起看看吧2025-03-03
SpringBoot整合Mybatis-plus和Redis實(shí)現(xiàn)投票功能
投票功能是一個(gè)非常常見的Web應(yīng)用場景,這篇文章將為大家介紹一下如何將Redis和Mybatis-plus整合到SpringBoot中,實(shí)現(xiàn)投票功能,感興趣的可以了解一下2023-05-05
利用Redis實(shí)現(xiàn)防止接口重復(fù)提交功能
大家好,本篇文章主要講的是利用Redis實(shí)現(xiàn)防止接口重復(fù)提交功能,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
利用Redis進(jìn)行數(shù)據(jù)緩存的項(xiàng)目實(shí)踐
在實(shí)際的業(yè)務(wù)場景中,Redis 一般和其他數(shù)據(jù)庫搭配使用,用來減輕后端數(shù)據(jù)庫的壓力,本文就介紹了利用Redis進(jìn)行數(shù)據(jù)緩存的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2022-06-06
Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄的示例代碼
本文主要介紹了基于Redis如何實(shí)現(xiàn)短信驗(yàn)證碼登錄功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
記錄一次并發(fā)情況下的redis導(dǎo)致服務(wù)假死的問題解決
由于Redis需要依賴于操作系統(tǒng)環(huán)境,如果系統(tǒng)資源受限,比如過量的進(jìn)程在擠占系統(tǒng)資源、系統(tǒng)死鎖等情況,本文主要介紹了記錄一次并發(fā)情況下的redis導(dǎo)致服務(wù)假死的問題解決,感興趣的可以了解一下2023-09-09
CentOS 6.5 64位下安裝Redis3.0.2的具體步驟
這篇文章主要介紹了CentOS 6.5 64位下安裝Redis3.0.2的具體步驟,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08

