SMEMBERS 是什么
返回集合的全部成员,顺序不保证。集合的语义就是无序,所以这个命令适合「一次拿全量做去重、校验或同步」,不适合分页展示。当集合规模很大时,一次拉取全部成员会同时压垮内存与网络,遍历应改用游标式的扫描命令。
基本信息
| 命令 | SMEMBERS 键,返回全部成员数组 |
|---|---|
| 复杂度 | 与成员数量线性相关 |
| 顺序 | 不保证,多次调用顺序可能不同 |
| 规模查询 | SCARD 先看成员总数,再决定用哪种遍历方式 |
| 安全遍历 | SSCAN 键 游标 COUNT 数量,分批返回 |
典型使用场景
- 小集合直接取全量:标签、白名单、权限点这类规模可控的集合
- 去重校验:拉取成员与另一数据源比对差异
- 缓存预热:把集合内容一次性同步到本地内存
- 运维核对:确认某业务集合的成员是否与预期一致
- 大集合替代方案:改用扫描命令分批遍历,或改用有序集合
示例
示例
SADD online:u 1001 1002 1003
SMEMBERS online:u # 返回 3 个成员,顺序不保证
SCARD online:u # 先看规模,返回 3
SISMEMBER online:u 1001 # 判断单个成员是否存在,O(1)
# 大集合遍历:游标分批扫描
SSCAN online:u 0 COUNT 500
# 需要有序遍历时改用有序集合
ZADD rank:online 1 1001 2 1002
ZRANGE rank:online 0 -1输出逐列读法
| 返回 | 含义 | 注意 |
|---|---|---|
| 成员数组 | 集合的全部成员 | 顺序不保证,不能依赖下标 |
| 空数组 | 集合不存在或为空 | 两种情况的返回一致,需另行判断 |
| 游标与批次 | 扫描命令返回新游标与成员片段 | 游标为 0 表示遍历结束 |
| 成员判断结果 | 存在返回 1,不存在返回 0 | 判断单个成员用它比拉全量高效 |
扫描命令只保证遍历完整,不保证同一批次的成员稳定:期间新增或删除的成员可能出现也可能不出现。
对百万级集合直接取全量:单条命令同时拉爆实例内存与网络带宽,还可能阻塞其他请求。