当前位置:首页 > 问答 > 正文

Redis里头怎么快速搞个集合,顺便教你设置那个集合的操作

想在Redis里快速搞个集合,这事儿其实特别简单,你可以把Redis的集合想象成一个没有顺序、但能自动帮你避免重复的袋子,你往里面扔东西,比如一堆水果的名字,就算你重复扔了“苹果”,这个袋子里也只会有一个“苹果”,这在很多场景下非常有用,比如统计文章的所有唯一标签、记录中奖的用户ID(防止重复中奖)、或者找出两个人的共同好友等等。

怎么创建和添加元素?(来源:Redis命令官方文档,SETS相关命令)

你得有个Redis服务器在运行,并且用客户端连接上了,最核心的命令就是 SADD,这个命令的名字就是“Set Add”的缩写,非常直白。

假设我们现在要创建一个叫做“myset”的集合,里面存放一些水果,你只需要一行命令:

SADD myset apple banana orange

这行命令的意思就是:向名为“myset”的集合中,一次性添加三个成员:“apple”、“banana”和“orange”,myset”这个集合本来不存在,Redis会非常贴心地先帮你创建它,然后再把元素加进去,执行成功后,Redis会返回一个数字,告诉你成功添加了几个新成员,如果这三个水果都是新的,它就返回3,如果你再执行一次 SADD myset apple,它就会返回0,因为“apple”已经存在了,不会被重复添加。

你看,创建一个集合并添加元素,就是这么简单直接,一行命令就搞定了。

怎么查看集合里的所有元素?(来源:Redis命令官方文档,SETS相关命令)

东西加进去了,你总得看看里面有什么吧?这时候就要用到 SMEMBERS 命令,这个名字也很好记,“Set Members”(集合的成员)。

你只需要输入:

SMEMBERS myset

Redis就会把“myset”这个集合里所有的元素都列出来,不过要注意,因为集合是无序的,所以你每次执行这个命令,看到的顺序可能都不一样,这很正常,不用担心。

还有哪些常用的集合操作?(来源:Redis命令官方文档,SETS相关命令)

除了基本的添加和查看,Redis集合真正强大的地方在于它提供了丰富的集合运算操作,这些操作和我们数学课上学的集合运算很像,但用起来更方便。

  1. 判断一个元素在不在集合里: 使用 SISMEMBER 命令,你想知道“myset”里有没有“apple”,就输入:

    SISMEMBER myset apple

    如果存在,返回1;不存在,返回0,这个操作速度极快,是集合的一个巨大优势。

    Redis里头怎么快速搞个集合,顺便教你设置那个集合的操作

  2. 删除集合里的元素: 使用 SREM 命令,想把“banana”从集合里拿走:

    SREM myset banana
  3. 获取集合的元素个数: 使用 SCARD 命令(Cardinality的缩写,意思是基数,也就是集合中不同元素的数量)。

    SCARD myset
  4. 随机从集合中弹出(取出并删除)一个元素: 使用 SPOP 命令,这非常适合抽奖场景,比如从“幸运用户”集合中随机抽一位幸运儿:

    SPOP lucky_users

    抽出来后,这个人就从集合中移除了,保证了不会重复抽中。

  5. 随机从集合中获取一个或多个元素(但不删除): 使用 SRANDMEMBER 命令,它只是看看,不真的拿走。

    SRANDMEMBER myset 2

    后面的数字2表示你想获取2个随机元素。

高级玩法:集合间的运算(来源:Redis命令官方文档,SETS相关命令)

Redis里头怎么快速搞个集合,顺便教你设置那个集合的操作

假设你现在有两个集合,一个叫“friends:user1”,记录用户1的好友ID(比如101, 102, 103),另一个叫“friends:user2”,记录用户2的好友ID(比如102, 103, 104)。

  • 求交集: 找出两个用户共同的爱好,使用 SINTER 命令。

    SINTER friends:user1 friends:user2

    返回结果就是 {102, 103},这是他俩的共同好友。

  • 求并集: 把两个用户的所有好友合并在一起(去重),使用 SUNION 命令。

    SUNION friends:user1 friends:user2

    返回结果是 {101, 102, 103, 104}。

  • 求差集: 找出用户1有,但用户2没有的好友,使用 SDIFF 命令。

    SDIFF friends:user1 friends:user2

    返回结果是 {101},注意,命令的顺序很重要,如果把两个集合调换位置,结果就是用户2有而用户1没有的好友 {104}。

更厉害的是,Redis还允许你把这些运算的结果直接存到一个新的集合里去,只需要在命令后面加上 STORE 参数,想把两个用户的共同好友存到一个叫“common_friends”的新集合里,可以这样做:


SINTERSTORE common_friends friends:user1 friends:user2```
这样,不仅看到了结果,还永久保存了它,后续可以直接使用“common_friends”这个集合。
**一些实用小贴士**
*   **性能很好:** 上面提到的这些操作,比如添加、检查是否存在、求交集并集等,在Redis内部都实现得非常高效,即使你的集合里有上百万个元素,速度也很快。
*   **存储的是字符串:** 集合里存的都是字符串类型,如果你存的是数字,Redis也会把它当作字符串来存储。
*   **没有修改操作:** 集合本身不支持直接修改某个元素,如果你想“修改”,通常的做法是先把这个元素删掉(`SREM`),然后再加入新的元素(`SADD`)。
在Redis里搞个集合并进行操作,核心就是记住几个简单的命令:`SADD`(加)、`SMEMBERS`(看全部)、`SISMEMBER`(查存在)、`SREM`(删),再进阶一点,就是用 `SINTER`, `SUNION`, `SDIFF` 来做集合运算,解决像共同好友、标签合并这类实际问题,整个过程不需要复杂的配置,直接使用命令行就能快速上手,这就是Redis集合的魅力所在。