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:pythonusers:javascriptusers:redisusers: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,user7SUNION users:python users:javascript users:redis users:sql->user1、user2、user3、user4、user5、user6、user7、user8SDIFF users:python users:javascript users:redis->user1SISMEMBER users:sql user5->0SINTERSTORE users:javascript_redis users:javascript users:redisSUNIONSTORE users:python_or_sql users:python users:sqlSDIFFSTORE users:sql_not_python users:sql users:python
