保定專業(yè)做網(wǎng)站seo網(wǎng)絡(luò)貿(mào)易網(wǎng)站推廣
文章目錄
- 一、Set 類型介紹
- 二、Set 類型相關(guān)命令
- 2.1 添加元素和檢查成員
- 2.2 移除元素
- 2.3 集合運(yùn)算
- 求交集
- 求并集
- 求差集
- 2.4 Set 相關(guān)命令總結(jié)
- 三、Set 類型編碼方式
- 四、Set 使用場(chǎng)景
一、Set 類型介紹
Set(集合)是 Redis 數(shù)據(jù)庫(kù)中的一種數(shù)據(jù)類型,它是一種無(wú)序的、不重復(fù)的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)一組唯一的元素。Set 在 Redis 中非常實(shí)用,因?yàn)樗峁┝烁咝У某蓡T查找和去重功能,常用于處理一些需要存儲(chǔ)唯一值的場(chǎng)景。以下是關(guān)于 Redis 中 Set 類型的介紹:
特點(diǎn)和用途:
-
無(wú)序性:Set 中的元素是無(wú)序排列的,與元素的插入順序無(wú)關(guān)。
-
唯一性:Set 中的元素是唯一的,不允許出現(xiàn)重復(fù)元素。
-
高效的成員查找:Redis 提供了高效的成員查找操作,可以快速判斷一個(gè)元素是否存在于集合中。
-
去重:由于元素的唯一性,Set 常用于去重操作,將一組數(shù)據(jù)轉(zhuǎn)換為不含重復(fù)元素的數(shù)據(jù)集。
-
集合運(yùn)算:Redis 提供了多個(gè)集合運(yùn)算命令,可以對(duì)多個(gè)集合進(jìn)行交集、并集和差集等操作。
-
支持多種數(shù)據(jù)類型:Set 可以存儲(chǔ)字符串、數(shù)字、甚至其他 Redis 數(shù)據(jù)類型的元素。
二、Set 類型相關(guān)命令
Set(集合)是 Redis 中的一種無(wú)序且不重復(fù)的數(shù)據(jù)結(jié)構(gòu),它包含了一組唯一的成員。以下是與 Set 數(shù)據(jù)類型相關(guān)的常見(jiàn)命令:
2.1 添加元素和檢查成員
-
SADD:將一個(gè)或多個(gè)成員添加到集合中。
語(yǔ)法:
SADD key member [member ...]
-
SMEMBERS:返回集合中的所有成員。
-
SISMEMBER:檢查指定成員是否存在于集合中。
語(yǔ)法:
SISMEMBER key member
-
SCARD:獲取集合的基數(shù)(即成員數(shù)量)。
語(yǔ)法:
SCARD key
2.2 移除元素
-
SPOP:隨機(jī)移除并返回集合中的一個(gè)成員。
語(yǔ)法:
SPOP key [count]
-
SMOVE:將指定成員從一個(gè)集合移動(dòng)到另一個(gè)集合。
語(yǔ)法:
SMOVE source destination member
-
SREM:從集合中移除一個(gè)或多個(gè)成員。
語(yǔ)法:
SREM key member [member ...]
2.3 集合運(yùn)算
求交集
-
SINTER:返回多個(gè)集合的交集。
語(yǔ)法:
SINTER key [key ...]
-
SINTERSTORE:將多個(gè)集合的交集存儲(chǔ)到一個(gè)新集合中。
語(yǔ)法:
SINTERSTORE destination key [key ...]
求并集
-
SUNION:返回多個(gè)集合的并集。
語(yǔ)法:
SUNION key [key ...]
-
SUNIONSTORE:將多個(gè)集合的并集存儲(chǔ)到一個(gè)新集合中。
語(yǔ)法:
SUNIONSTORE destination key [key ...]
求差集
-
SDIFF:返回第一個(gè)集合與其他集合的差集。
語(yǔ)法:
SDIFF key [key ...]
-
SDIFFSTORE:將第一個(gè)集合與其他集合的差集存儲(chǔ)到一個(gè)新集合中。
語(yǔ)法:
SDIFFSTORE destination key [key ...]
2.4 Set 相關(guān)命令總結(jié)
以下是與 Set 類型相關(guān)的命令的總結(jié),包括命令、作用和時(shí)間復(fù)雜度:
命令 | 作用 | 時(shí)間復(fù)雜度 |
---|---|---|
SADD | 向集合中添加一個(gè)或多個(gè)成員 | O(N) (N 為添加成員的數(shù)量) |
SMEMBERS | 返回集合中的所有成員 | O(N) (N 為集合中的元素?cái)?shù)量) |
SISMEMBER | 檢查成員是否存在于集合中 | O(1) |
SCARD | 獲取集合的基數(shù)(成員數(shù)量) | O(1) |
SPOP | 隨機(jī)移除并返回集合中的一個(gè)成員 | O(1) |
SMOVE | 將成員從一個(gè)集合移動(dòng)到另一個(gè)集合 | O(1) |
SREM | 從集合中移除一個(gè)或多個(gè)成員 | O(N) (N 為移除成員的數(shù)量) |
SINTER | 返回多個(gè)集合的交集 | O(N*M) (N 和 M 為集合的大小) |
SINTERSTORE | 將多個(gè)集合的交集存儲(chǔ)到一個(gè)新集合中 | O(N*M) (N 和 M 為集合的大小) |
SUNION | 返回多個(gè)集合的并集 | O(N+M) (N 和 M 為集合的大小) |
SUNIONSTORE | 將多個(gè)集合的并集存儲(chǔ)到一個(gè)新集合中 | O(N+M) (N 和 M 為集合的大小) |
SDIFF | 返回第一個(gè)集合與其他集合的差集 | O(N) (N 為第一個(gè)集合的大小) |
SDIFFSTORE | 將第一個(gè)集合與其他集合的差集存儲(chǔ)到一個(gè)新集合中 | O(N) (N 為第一個(gè)集合的大小) |
Set 數(shù)據(jù)類型適用于需要存儲(chǔ)一組唯一值的情況,例如標(biāo)簽、用戶的興趣愛(ài)好等。使用合適的 Set 相關(guān)命令,可以高效地進(jìn)行成員的添加、刪除、查找以及集合運(yùn)算。
三、Set 類型編碼方式
Redis 中的 Set 數(shù)據(jù)類型的內(nèi)部編碼方式有兩種,分別是intset和hashtable。這兩種編碼方式根據(jù)集合的大小和元素類型來(lái)選擇,以最大程度地節(jié)省內(nèi)存和提高性能。
-
intset(整數(shù)集合):
-
特點(diǎn):intset 是 Redis 用于表示只包含整數(shù)值的集合的編碼方式。它是一個(gè)有序的、緊湊的、不可重復(fù)的集合,內(nèi)部使用整數(shù)表示元素值。
-
適用場(chǎng)景:intset 適用于存儲(chǔ)小型整數(shù)集合,因?yàn)樗趦?nèi)存占用和性能方面都非常高效。當(dāng)集合中的元素都是整數(shù)且數(shù)量較少時(shí),Redis 會(huì)選擇使用 intset 編碼。
-
優(yōu)點(diǎn):
- 節(jié)省內(nèi)存:intset 采用緊湊的二進(jìn)制存儲(chǔ),每個(gè)整數(shù)只占用所需的字節(jié)。
- 高效的查找和插入:由于元素都是整數(shù)且有序,查找和插入操作的時(shí)間復(fù)雜度是 O(log(N))。
-
-
hashtable(哈希表):
-
特點(diǎn):hashtable 是 Redis 用于表示包含字符串、浮點(diǎn)數(shù)或其他數(shù)據(jù)類型的集合的編碼方式。它是一個(gè)無(wú)序的、動(dòng)態(tài)大小的集合,內(nèi)部使用哈希表來(lái)存儲(chǔ)元素。
-
適用場(chǎng)景:hashtable 適用于存儲(chǔ)包含各種數(shù)據(jù)類型的集合,以及大型集合,因?yàn)樗梢詣?dòng)態(tài)增長(zhǎng)并處理各種數(shù)據(jù)類型。
-
優(yōu)點(diǎn):
- 適用性廣泛:hashtable 可以存儲(chǔ)不同類型的數(shù)據(jù),而不僅限于整數(shù)。
- 動(dòng)態(tài)增長(zhǎng):可以隨時(shí)添加或刪除元素,適用于大型集合。
-
Redis 在使用 Set 類型時(shí)會(huì)根據(jù)集合的內(nèi)容和大小自動(dòng)選擇 intset 或 hashtable 編碼方式,以優(yōu)化內(nèi)存和性能。這種智能的編碼方式選擇是 Redis 內(nèi)存管理的一部分,使得 Redis 在處理不同類型和大小的集合時(shí)能夠充分發(fā)揮其優(yōu)勢(shì)。
四、Set 使用場(chǎng)景
場(chǎng)景:標(biāo)簽管理
假設(shè)你正在開(kāi)發(fā)一個(gè)社交平臺(tái),需要為用戶添加興趣標(biāo)簽,并能夠計(jì)算用戶之間的共同興趣標(biāo)簽。以下是如何使用 Redis 的集合數(shù)據(jù)類型來(lái)實(shí)現(xiàn)這個(gè)場(chǎng)景:
-
給用戶添加標(biāo)簽
用戶A對(duì)娛樂(lè)、體育板塊感興趣,用戶B對(duì)歷史、新聞感興趣,這些興趣點(diǎn)可以被抽象為標(biāo)簽。
SADD user:1:tags entertainment sports SADD user:2:tags history news
這些命令將用戶的標(biāo)簽信息存儲(chǔ)在名為
user:1:tags
和user:2:tags
的集合中。 -
給標(biāo)簽添加用戶
現(xiàn)在,讓我們?yōu)槊總€(gè)標(biāo)簽創(chuàng)建一個(gè)集合,用于存儲(chǔ)對(duì)該標(biāo)簽感興趣的用戶。
SADD entertainment:users user:1 SADD sports:users user:1 SADD history:users user:2 SADD news:users user:2
這些命令將用戶與其對(duì)應(yīng)的標(biāo)簽建立關(guān)聯(lián)關(guān)系。
-
刪除用戶下的標(biāo)簽
如果用戶取消了對(duì)某些標(biāo)簽的興趣,可以使用
SREM
命令來(lái)刪除相應(yīng)的標(biāo)簽。SREM user:1:tags sports
這個(gè)命令將用戶A的興趣標(biāo)簽中的 “sports” 刪除。
-
刪除標(biāo)簽下的用戶
如果某個(gè)標(biāo)簽不再被用戶關(guān)注,可以使用
SREM
命令來(lái)刪除相應(yīng)的用戶。SREM sports:users user:1
這個(gè)命令將用戶A從 “sports” 標(biāo)簽的關(guān)注列表中移除。
-
計(jì)算用戶的共同興趣標(biāo)簽
要計(jì)算兩個(gè)用戶的共同興趣標(biāo)簽,可以使用
SINTER
命令。SINTER user:1:tags user:2:tags
這個(gè)命令將返回用戶1和用戶2的共同興趣標(biāo)簽。
通過(guò)這些 Redis 的集合操作,你可以輕松地實(shí)現(xiàn)標(biāo)簽管理功能,包括用戶的興趣標(biāo)簽添加、刪除以及計(jì)算用戶之間的共同興趣標(biāo)簽。這對(duì)于增強(qiáng)用戶體驗(yàn)和個(gè)性化推薦非常有幫助。
除了標(biāo)簽管理之外,Redis 的集合數(shù)據(jù)類型還適用于許多其他場(chǎng)景。以下是一些額外的場(chǎng)景示例:
-
社交網(wǎng)絡(luò)關(guān)系:在社交網(wǎng)絡(luò)應(yīng)用中,你可以使用集合存儲(chǔ)用戶的好友列表、關(guān)注列表和粉絲列表,以及用戶之間的共同好友等信息。這使得查找和管理社交關(guān)系變得非常高效。
-
在線用戶管理:集合可以用于維護(hù)在線用戶列表,快速檢查用戶是否在線,以及獲取在線用戶的數(shù)量和列表。這對(duì)于實(shí)時(shí)聊天、在線游戲等應(yīng)用非常有用。
-
投票和計(jì)數(shù):你可以使用集合來(lái)記錄投票或計(jì)數(shù)的情況,例如統(tǒng)計(jì)文章的點(diǎn)贊數(shù)、收藏?cái)?shù)、評(píng)論數(shù)等。每個(gè)用戶可以在集合中表示一次投票或計(jì)數(shù)操作,而集合會(huì)自動(dòng)去重。