redis数据结构-08(SINTER、SUNION、SDIFF、SISMEMBER)
集合运算:SINTER、SUNION、SDIFF、SISMEMBER
Redis 集合是一种功能强大的数据结构,可用于存储一组唯一元素。本课基于上一课对 Redis 集合的介绍,深入探讨了使 Redis 集合如此多功能的基本集合操作: SINTER
、 SUNION
、 SDIFF
和 SISMEMBER
。理解这些操作对于高效地管理和查询 Redis 数据库中的数据至关重要。这些操作使您能够直接在 Redis 中执行复杂的数据分析和操作,从而最大限度地减少将数据传输到其他系统进行处理的需要。
设置交叉点:SINTER
SINTER
命令计算多个集合的交集。换句话说,它返回_所有_指定集合的所有元素。这对于查找不同数据组中的共同元素非常有用。
基本用法
SINTER
的语法很简单:
SINTER key1 key2 [key3 ...]
其中 key1
、 key2
等等是您想要相交的集合的名称。
例子
假设我们有两组代表喜欢不同编程语言的用户:
users:python
:喜欢 Python 的用户users:javascript
:喜欢 JavaScript 的用户
我们可以使用 SINTER
找到_同时_喜欢 Python 和 JavaScript 的用户:
SADD users:python user1 user2 user3
SADD users:javascript user2 user4 user5
SINTER users:python users:javascript
结果将是:
1) "user2"
这表明 user2
是唯一一个同时喜欢 Python 和 JavaScript 的用户。
多组
SINTER
可以处理两个以上的集合。例如,如果我们有第三个集合 users:redis
:
SADD users:redis user2 user3 user6
SINTER users:python users:javascript users:redis
结果将是:
1) "user2"
因为 user2
是所有三个集合的唯一成员。
空集
如果任何集合为空, SINTER
将返回一个空集。
SADD users:python user1 user2 user3
SINTER users:python users:nonexistent_set
结果将是一个空集( redis-cli
中的空数组)。
SINTERSTORE
有时,您可能希望将交集的结果存储在一个新集合中。这时, SINTERSTORE
就派上用场了。
SINTERSTORE destination key1 key2 [key3 ...]
此命令对集合 key1
、 key2
等进行求交,并将结果存储在名为 destination
的集合中。
例子:
SADD users:python user1 user2 user3
SADD users:javascript user2 user4 user5
SINTERSTORE users:python_javascript users:python users:javascript
SMEMBERS users:python_javascript
SMEMBERS
命令将返回:
1) "user2"
集合 users:python_javascript
现在包含两个原始集合的交集。
集合并集:SUNION
SUNION
命令返回多个集合的并集。这意味着它返回_任何_指定集合中存在的所有唯一元素。
基本用法
SUNION
的语法是:
SUNION key1 key2 [key3 ...]
其中 key1
、 key2
等等是要合并的集合的名称。
例子
使用我们之前的用户和编程语言的示例:
SADD users:python user1 user2 user3
SADD users:javascript user2 user4 user5
SUNION users:python users:javascript
结果将是:
1) "user1"
2) "user2"
3) "user3"
4) "user4"
5) "user5"
这将显示所有喜欢 Python 或 JavaScript(或两者兼有)的用户。请注意, user2
仅出现一次,因为集合仅包含唯一元素。
多组
与 SINTER
类似, SUNION
可以处理多个集合:
SADD users:redis user2 user3 user6
SUNION users:python users:javascript users:redis
结果将是:
1) "user1"
2) "user2"
3) "user3"
4) "user4"
5) "user5"
6) "user6"
这包括所有喜欢 Python、JavaScript 或 Redis 的用户。
SUNIONSTORE
与 SINTERSTORE
类似, SUNIONSTORE
将并集的结果存储在一个新集合中:
SUNIONSTORE destination key1 key2 [key3 ...]
例子:
SADD users:python user1 user2 user3
SADD users:javascript user2 user4 user5
SUNIONSTORE users:python_javascript_or_both users:python users:javascript
SMEMBERS users:python_javascript_or_both
SMEMBERS
命令将返回:
1) "user1"
2) "user2"
3) "user3"
4) "user4"
5) "user5"
The set users:python_javascript_or_both
now contains the union of the two original sets. 重试 错误原因
设置差异:SDIFF
SDIFF
命令返回集合之间的差值。它返回属于_第一个_集合但_不_属于任何其他集合的所有元素。集合的顺序对于 SDIFF
来说非常重要。
基本用法
SDIFF
的语法是:
SDIFF key1 key2 [key3 ...]
其中 key1
是要从中减去其他集合( key2
、 key3
等)元素的集合。
例子
SADD users:python user1 user2 user3
SADD users:javascript user2 user4 user5
SDIFF users:python users:javascript
结果将是:
1) "user1"
2) "user3"
这显示了喜欢 Python 但不喜欢 JavaScript 的 user2
。user2 被排除在外,因为他们也喜欢 JavaScript。
顺序很重要
集合的顺序至关重要。如果我们反转上例中的顺序:
SDIFF users:javascript users:python
结果将是:
1) "user4"
2) "user5"
这显示了喜欢 JavaScript 但_不喜欢_ Python 的用户。
多组
SDIFF
还可以处理多个集合。例如:
SADD users:redis user3 user6
SDIFF users:python users:javascript users:redis
结果将是:
1) "user1"
这显示了喜欢 Python 但_不喜欢_ JavaScript 或 Redis 的 user3
。user3 被排除在外,因为他们也喜欢 Redis。
SDIFFSTORE
与其他操作一样, SDIFFSTORE
将差异的结果存储在一个新集合中:
SDIFFSTORE destination key1 key2 [key3 ...]
例子:
SADD users:python user1 user2 user3
SADD users:javascript user2 user4 user5
SDIFFSTORE users:python_not_javascript users:python users:javascript
SMEMBERS users:python_not_javascript
SMEMBERS
命令将返回:
1) "user1"
2) "user3"
集合 users:python_not_javascript
现在包含两个原始集合之间的差异。
设置成员资格:SISMEMBER
SISMEMBER
命令检查给定元素是否为集合的成员。如果元素是成员,则返回 1
;如果不是,则返回 0
。
基本用法
SISMEMBER
的语法是:
SISMEMBER key member
其中 key
是集合的名称, member
是要检查的元素。
例子
SADD users:python user1 user2 user3
SISMEMBER users:python user1
结果将是:
1
这表明 user1
是 users:python
集的成员。
SISMEMBER users:python user4
结果将是:
0
这表明 user4
不是 users:python
集的成员。
检查不存在的集合
如果该集合不存在, SISMEMBER
将始终返回 0
。
SISMEMBER nonexistent_set user1
结果将是:
0
实例和练习
让我们通过一些实践练习来巩固你的理解。继续我们的用户和编程语言示例,考虑以下场景:
我们有代表对不同技术感兴趣的用户的集合:
users:python
users:javascript
users:redis
users:sql
以下是每组的数据:
SADD users:python user1 user2 user3 user7
SADD users:javascript user2 user4 user5 user7
SADD users:redis user3 user6 user7
SADD users:sql user1 user4 user8
现在,尝试使用我们学过的 Redis 命令来回答以下问题:
- 查找对 Python 和 SQL 都感兴趣的用户。 (使用
SINTER
) - 查找对这四种技术感兴趣的所有唯一用户。 (使用
SUNION
) - 查找对 Python 感兴趣但对 JavaScript 或 Redis 不感兴趣的用户。 (使用
SDIFF
) - 检查用户 5 是否对 SQL 感兴趣。 (使用
SISMEMBER
) - 将对 JavaScript 和 Redis 感兴趣的用户存储在一个名为
users:javascript_redis
的新集合中。 (使用SINTERSTORE
) - 将所有对 Python 或 SQL 感兴趣的用户存储在一个名为
users:python_or_sql
的新集合中。 (使用SUNIONSTORE
) - 将对 SQL 感兴趣但不对 Python 感兴趣的用户存储在一个名为
users:sql_not_python
的新集合中。 (使用SDIFFSTORE
)
答案:
SINTER users:python users:sql
->user1
,user7
SUNION users:python users:javascript users:redis users:sql
->user1
、user2
、user3
、user4
、user5
、user6
、user7
、user8
SDIFF users:python users:javascript users:redis
->user1
SISMEMBER users:sql user5
->0
SINTERSTORE users:javascript_redis users:javascript users:redis
SUNIONSTORE users:python_or_sql users:python users:sql
SDIFFSTORE users:sql_not_python users:sql users:python