*Redis SMEMBERS 命令

返回 Set 中的所有成员。


*语法

SMEMBERS key

*参数说明

参数 类型 必填 说明
key String Set 的键名

*返回值

条件 返回值
key 存在 返回所有成员的数组
key 不存在 空数组 []

*时间复杂度

O(N),N 为 Set 的基数(成员数量)。

⚠️ 生产环境警告:大 Set(>5000 成员)的 SMEMBERS 会阻塞 Redis,造成延迟飙升。应使用 SSCAN 渐进式遍历。


*示例

> SADD tags redis database cache
(integer) 3

> SMEMBERS tags
1) "cache"
2) "database"
3) "redis"

# 不存在
> SMEMBERS nokey
(empty array)

*常见错误

  1. 阻塞服务:SMEMBERS 大 Set 是最常见的 Redis 性能事故之一。
  2. 客户端内存溢出:返回结果全部加载到客户端内存。

*最佳实践

  1. 生产禁用大 Set SMEMBERS:成员 > 5000 时,改用 SSCAN key 0 COUNT 100
  2. 判断存在性:用 SISMEMBER key member(O(1)),不要用 SMEMBERS 后遍历。
  3. 随机抽样:用 SRANDMEMBER key count 获取随机成员,不需要全部遍历。

*FAQ

Q: SMEMBERS 返回有序吗? A: 不保证有序。Set 是无序集合,返回顺序取决于内部哈希表实现。

Q: 如何替代 SMEMBERS 遍历大 Set? A: 使用 SSCAN key cursor [MATCH pattern] [COUNT count] 分批遍历。

Q: SMEMBERS 和 SISMEMBER 如何选择? A: 只需判断单个成员是否存在用 SISMEMBER(O(1));需要全部成员才用 SMEMBERS,且必须确认 Set 不大。