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

怎么快速看Redis里Set集合的内容,常用命令有哪些啊?

要查看Redis里Set集合的内容,最直接、最常用的命令就是SMEMBERS,这个命令非常简单,你只需要在Redis客户端(比如命令行工具redis-cli)里输入 SMEMBERS your_set_key,然后按回车,它就会把这个Set集合里所有的成员一个不落地全部显示给你看,这里的 your_set_key 就是你这个Set集合的名字,你需要把它替换成你自己实际使用的键名,比如你有一个叫“friends:user123”的Set,里面存了用户123的所有好友ID,那么你输入 SMEMBERS friends:user123,Redis就会返回像["user456", "user789", "user101"]这样的结果,这个命令非常适合当你明确知道Set的键名,并且想看看里面到底有什么的时候使用,非常直观。(来源:Redis官方文档对SMEMBERS命令的描述)

SMEMBERS命令有一个特点你需要留意:如果这个Set集合非常大,里面有几百万甚至更多个成员,那么使用这个命令可能会消耗比较多的时间和服务器的内存资源,因为它是一次性把所有数据都取回来的,在Redis的术语里,我们管这种命令叫“可能会阻塞”的命令,意思是在执行这个命令的时候,服务器需要花大力气来处理,可能会短暂影响处理其他请求的速度,虽然它很快很方便,但在处理超大集合时需要谨慎。(来源:Redis官方文档关于命令复杂度的说明)

那如果Set真的很大,我们有没有更“温柔”一点的办法来查看内容呢?有的,那就是SSCAN命令,这个命令不像SMEMBERS那样“一口吃成胖子”,而是像翻书一样,一页一页地给你看,它的用法是 SSCAN key cursor [MATCH pattern] [COUNT count],刚开始的时候,你把游标(cursor)设置为0,比如输入 SSCAN mybigset 0,Redis会返回两个东西:一个是下一次扫描应该用的新游标值,另一个是本次扫描得到的一部分成员,如果返回的新游标不是0,你就需要把这个新游标数字带到下一次命令里,SSCAN mybigset 17,这样一直重复,直到返回的游标再次变成0,就表示所有成员都遍历完了,你还可以用 MATCH 参数来只查找符合特定模式的成员(比如以“abc”开头的),也可以用 COUNT 参数来建议每次返回多少成员(注意这只是个建议值,Redis不一定完全遵守)。SSCAN命令的好处是它不会长时间占用服务器资源,适合在生产环境中安全地检查大集合。(来源:Redis官方文档对SCAN系列命令的描述)

除了这两个专门用于“查看”内容的命令,了解Set集合的其他常用命令也至关重要,因为它们能帮你更好地理解Set里为什么会是那些内容,下面是一些非常高频的命令:

  1. SADD:这是往Set里添加成员的命令,用法是 SADD key member [member ...],你可以一次添加一个成员,也可以一次添加多个,如果添加的成员已经存在于Set中,那么Redis会忽略这个重复的成员,因为Set的核心特性就是成员唯一,不允许重复,这是构建一个Set的基础命令。(来源:Redis官方文档对SADD命令的描述)

  2. SREM:和SADD相反,它是从Set里删除指定成员的命令,用法是 SREM key member [member ...],同样可以一次删一个或删多个,如果你尝试删除一个不存在的成员,Redis也不会报错,只是简单地忽略它。(来源:Redis官方文档对SREM命令的描述)

  3. SISMEMBER:这个命令用来快速检查某一个特定的成员是否存在于Set中,用法是 SISMEMBER key member,它返回的结果非常直接:如果成员存在,返回整数1;如果不存在,返回整数0,这个命令的速度极快,常用来做成员资格验证,比如判断一个用户ID是否在黑名单Set里。(来源:Redis官方文档对SISMEMBER命令的描述)

  4. SCARD:这个命令不关心具体内容是什么,它只告诉你这个Set集合的“基数”是多少,说白了就是成员的总数量,用法是 SCARD key,当你只想知道有多少个元素而不需要知道具体是哪些的时候,用这个命令非常高效。(来源:Redis官方文档对SCARD命令的描述)

  5. SRANDMEMBER:这个命令能从Set中随机返回一个或多个成员,用法是 SRANDMEMBER key [count],只写键名的话,就返回一个随机成员,可以指定一个数量,让它返回多个,这个命令很有趣,比如可以用来实现“抽奖”功能,它有一个特点是,只是随机取出来看看,并不会把这个成员从Set里删除。(来源:Redis官方文档对SRANDMEMBER命令的描述)

  6. SPOP:这个命令也是随机返回成员,但和SRANDMEMBER的关键区别在于,SPOP在返回随机成员的同时,会把这个成员从原Set中移除,用法是 SPOP key [count],这就像是从一副牌里抽走一张牌,非常适合需要随机消耗一个项目的场景。(来源:Redis官方文档对SPOP命令的描述)

  7. 集合运算命令:Redis的Set还支持强大的数学集合运算,这是它非常亮眼的功能。

    • SDIFF:计算多个Set的差集SDIFF set1 set2 set3 会返回所有在set1中,但不在set2和set3中的成员。
    • SINTER:计算多个Set的交集,返回同时存在于所有给定Set中的成员。
    • SUNION:计算多个Set的并集,返回所有给定Set中出现的成员的总和(自动去重)。 这些命令在需要比较不同群体时非常有用,比如找出共同好友(交集)、A有而B没有的粉丝(差集)等。(来源:Redis官方文档对集合运算命令SDIFF, SINTER, SUNION的描述)

快速查看Redis Set内容,首选用SMEMBERS,集合太大时用SSCAN分页查看,而围绕着Set的日常操作,离不开增删改查的命令如SADD, SREM, SISMEMBER, SCARD,以及随机抽取相关的SRANDMEMBERSPOP,还有体现Set强大功能的集合运算命令SDIFF, SINTER, SUNION,掌握这些命令,你就能非常自如地使用Redis的Set数据结构了。

怎么快速看Redis里Set集合的内容,常用命令有哪些啊?