From 8e4fca612a758ffe6edcde4c8b9d161a7854cca8 Mon Sep 17 00:00:00 2001 From: asahi Date: Sat, 6 Sep 2025 16:21:49 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBredis=20sets=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 中间件/redis/redis.md | 99 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/中间件/redis/redis.md b/中间件/redis/redis.md index 5be03fc..2d11454 100644 --- a/中间件/redis/redis.md +++ b/中间件/redis/redis.md @@ -56,6 +56,15 @@ - [Blocking operations on lists](#blocking-operations-on-lists) - [BRPOP](#brpop) - [Automatic Creation and removal of keys](#automatic-creation-and-removal-of-keys) + - [redis sets](#redis-sets) + - [basic commands](#basic-commands) + - [SADD](#sadd) + - [SMEMBERS](#smembers) + - [SDIFF](#sdiff) + - [SINTER](#sinter) + - [SREM](#srem) + - [SPOP](#spop) + - [SRANDMEMBER](#srandmember) # redis @@ -851,3 +860,93 @@ client 2> rpush event-queue:2 baka > LPOP bikes:repairs (nil) ``` + +### redis sets +redis set是一个unordered collection of unique strings,通过redis sets可以高效进行如下操作: +- track unique items +- represent relations +- perform common set operations such as intersection, unions, and differences + +#### basic commands +- `SADD`: 向set中添加new member +- `SREM`: 从set中移除指定member +- `SISMEMBER`: 检查给定的string是否位于set中 +- `SINTER`: 返回两个或更多set的交集 +- `SCARD`: 返回set的大小(cardinality) + +#### SADD +`SADD`命令会向set中添加新的元素,示例如下: +```redis-cli +> SADD bikes:racing:france bike:1 bike:2 bike:3 +(integer) 3 +> SMEMBERS bikes:racing:france +1) bike:3 +2) bike:1 +3) bike:2 +``` +#### SMEMBERS +在上述示例中,`SMEMBERS`命令会返回set中所有的元素。`redis`并不保证元素的返回顺序,每次调用`SMEMBERS`命令都可能以任何顺序返回set中的元素。 + +#### SDIFF +可以通过SDIFF来返回两个sets的差异(差集)。例如,可以通过`SDIFF`命令查看有哪些元素位于`set1`中但是不位于`set2`中,示例如下: +```redis-cli +> SADD bikes:racing:usa bike:1 bike:4 +(integer) 2 +> SDIFF bikes:racing:france bikes:racing:usa +1) "bike:3" +2) "bike:2" +``` +上述示例中,则通过`SDIFF`命令展示了`bikes:racing:france`和`bikes:racing:usa`两个set的差集。 + +SDIFF命令在`difference between all sets is empty`时,会返回一个empty array。 + +#### SINTER +可以通过SINTER命令来取多个sets的交集。 + +```redis-cli +> SADD bikes:racing:france bike:1 bike:2 bike:3 +(integer) 3 +> SADD bikes:racing:usa bike:1 bike:4 +(integer) 2 +> SADD bikes:racing:italy bike:1 bike:2 bike:3 bike:4 +(integer) 4 +> SINTER bikes:racing:france bikes:racing:usa bikes:racing:italy +1) "bike:1" +> SUNION bikes:racing:france bikes:racing:usa bikes:racing:italy +1) "bike:2" +2) "bike:1" +3) "bike:4" +4) "bike:3" +> SDIFF bikes:racing:france bikes:racing:usa bikes:racing:italy +(empty array) +> SDIFF bikes:racing:france bikes:racing:usa +1) "bike:3" +2) "bike:2" +> SDIFF bikes:racing:usa bikes:racing:france +1) "bike:4" +``` +#### SREM +可以通过`SREM`命令来移除set中的元素,可以一次性移除一个或多个。 + +#### SPOP +`SPOP`命令支持随机移除一个element。 + +#### SRANDMEMBER +`SRANDMEMBER`命令支持随机返回一个set中的元素,但是不对其实际移除 + +上述命令的使用示例如下所示: +```redis-cli +> SADD bikes:racing:france bike:1 bike:2 bike:3 bike:4 bike:5 +(integer) 5 +> SREM bikes:racing:france bike:1 +(integer) 1 +> SPOP bikes:racing:france +"bike:3" +> SMEMBERS bikes:racing:france +1) "bike:2" +2) "bike:4" +3) "bike:5" +> SRANDMEMBER bikes:racing:france +"bike:2" +``` +