1. Redis数据类型-Set

Redis Set 是一种无序且不重复的集合数据结构,支持快速的添加、删除和成员检查操作。常用于实现标签系统、社交网络中的好友关系等场景。它还提供集合间的交集、并集和差集运算。总的来说,Redis 集合是一个强大而灵活的数据结构,适用于需要快速操作和处理大量不重复数据的场景。

image-20240914100450902

2. 常用命令

Set 相关所有命令:

命名 描述
SADD 向集合添加一个或多个成员
SCARD 获取集合的成员数
SDIFF 返回给定所有集合的差集
SDIFFSTORE 返回给定所有集合的差集并存储在 destination
SINTER 返回给定所有集合的交集
SINTERCARD 类似于SINTER,但它不返回结果集,而是只返回结果的基数。返回集合的基数,该基数将由所有给定集合的交集产生
SINTERSTORE 返回给定所有集合的交集并存储在 destination
SISMEMBER 判断 member元素是否是集合 key 的成员
SMEMBERS 获取一个集合的所有成员
SMISMEMBER 从存储在 key处的集合值中返回一个随机元素
SMOVE member 元素从 source集合移动到 destination 集合
SPOP 移除并返回集合中的一个随机元素
SRANDMEMBER 返回集合中一个或多个随机数
SREM 移除集合中一个或多个成员
SSCAN 迭代集合中的元素
SUNION 返回所有给定集合的并集
SUNIONSTORE 所有给定集合的并集存储在 destination 集合中

2.1 SADD

SADD 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素。

注意事项:

  • 假如集合 key 不存在,则创建一个只包含被添加的元素作为成员的集合。
  • 当集合 key 不是集合类型时,返回一个错误。
  • Redis 2.4 版本以前, 只接受单个成员值。

基本语法:

SADD key member [member ...]

示例:

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0
redis> SMEMBERS myset
1) "Hello"
2) "World"

2.2 SCARD

SCARD 命令返回集合中元素的数量,当集合 key 不存在时,返回 0

基本语法:

SCARD key

示例:

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SCARD myset
(integer) 2

2.3 SISMEMBER

SISMEMBER 命令返回存储在 key 中的集合的所有的成员。

注意事项:

  • 不存在的集合被视为空集合
  • 与运行带有一个参数 keySINTER 有同样的效果。

基本语法:

SMEMBERS key

示例:

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SMEMBERS myset
1) "Hello"
2) "World"

2.4 SREM

SREM 用于在集合中删除指定的元素,返回值为被删除元素个数,不含不存在的元素。

注意事项:

  • 如果指定的元素不是集合成员则被忽略。
  • 如果集合 key 不存在则被视为一个空的集合,该命令返回 0
  • 如果key的类型不是一个 Set ,则返回 ERR WRONGTYPE Operation against a key holding the wrong kind of value 错误。

基本语法:

SREM key member [member ...]

示例:

redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SREM myset "one"
(integer) 1
redis> SREM myset "four"
(integer) 0
redis> SMEMBERS myset
1) "two"
2) "three"

2.5 SSCAN

SSCAN 命令用于遍历集合中键的元素,继承自 SCAN

基本语法:

SSCAN key cursor [MATCH pattern] [COUNT count]

命令参数:

  • cursor:游标。
  • pattern :匹配的模式。
  • count :指定从数据集里返回多少元素,默认值为 10

示例:

> SADD myset1 "Google"
(integer) 1
> SADD myset1 "Redis"
(integer) 1
> SADD myset1 "Taobao"
(integer) 1
> SSCAN myset1 0 match R*
1) "0"
2) 1) "Redis"

2.6 SDIFF

SDIFF 命令返回第一个集合与其他集合之间的差异,也可以认为说第一个集合中独有的元素。不存在的集合 key 将视为空集。

基本语法:

SDIFF key [key ...]

示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFF key1 key2
1) "a"
2) "b"

2.7 SUNION

SUNION 命令用于返回所有给定集合的并集。

基本语法:

SUNION key [key ...]

示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNION key1 key2
1) "b"
2) "c"
3) "a"
4) "d"
5) "e"

2.8 SINTER

SINTER 返回所有给定集合的成员交集。

基本语法:

SINTER key [key ...]

示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTER key1 key2
1) "c"

2.10 SRANDMEMBER

SRANDMEMBER 命令随机返回集合 key 中的一个或多个随机元素。

注意事项:

  • 如果 key 不存在则返回 nil
  • 使用 count 参数,则返回一个随机的元素数组,如果 key 不存在则返回一个空的数组。

基本语法:

SRANDMEMBER key [count]

示例:

redis> SADD myset one two three
(integer) 3
redis> SRANDMEMBER myset
"two"
redis> SRANDMEMBER myset 2
1) "two"
2) "three"
redis> SRANDMEMBER myset -5
1) "one"
2) "three"
3) "two"
4) "one"
5) "two"

3. 应用场景

1. 标签系统

添加标签

SADD user:tags:1000 "python"
SADD user:tags:1000 "java"
SADD user:tags:1000 "c++"

查询标签

SMEMBERS user:tags:1000

删除标签

SREM user:tags:1000 "java"

2. 社交网络好友推荐

添加好友

SADD user:friends:1000 "1001"
SADD user:friends:1000 "1002"
SADD user:friends:1001 "1000"
SADD user:friends:1001 "1002"

查找共同好友

SINTER user:friends:1000 user:friends:1001

3. 邮箱地址去重

添加邮箱

SADD user:emails "user1@example.com"
SADD user:emails "user2@example.com"

检查邮箱是否已存在

SISMEMBER user:emails "user1@example.com"

4. 实时排行榜

更新用户得分

ZINCRBY user:scores 10 "user1"
ZINCRBY user:scores 20 "user2"

获取排行榜

ZREVRANGE user:scores 0 10 WITHSCORES

5. 抽奖活动

添加参与用户

SADD event:participants "user1"
SADD event:participants "user2"

检查用户是否已参与

SISMEMBER event:participants "user1"

这些脚本展示了如何在 Redis 中使用集合来实现各种实际应用场景。在实际应用中,你可能需要结合其他 Redis 命令和数据结构来实现更复杂的功能。