SISMEMBER 是什么
SISMEMBER 判断某个成员是否在集合里,返回 1 或 0;SMISMEMBER(Redis 6.2 起)一次判断多个成员,按传入顺序返回 0/1 数组。集合的存在性判断是常数复杂度,而且比用一堆字符串键逐个判断更省内存,成员天然去重,因此黑白名单、标签与幂等判断都优先选它。
基本信息
| 语法 | SISMEMBER key member / SMISMEMBER key member [member ...] |
|---|---|
| 返回 | 1 表示存在,0 表示不存在 |
| 复杂度 | SISMEMBER 为 O(1),SMISMEMBER 为 O(N) |
| 版本要求 | SMISMEMBER 需要 Redis 6.2 及以上 |
| 键不存在 | 返回 0,等价于集合为空,不报错 |
典型使用场景
- 判断来源 IP 是否命中黑名单,做访问控制
- 判断用户是否已有某个标签或已参与某活动
- 优惠券、签到等场景做幂等判断,避免重复发放
- 设备白名单校验,放行已知设备
- 批量判断一批成员的状态,减少网络往返
判断成员是否存在
判断成员是否存在
SADD blacklist:ip 1.2.3.4 5.6.7.8
SISMEMBER blacklist:ip 1.2.3.4 # 1
SISMEMBER blacklist:ip 9.9.9.9 # 0
SMISMEMBER blacklist:ip 1.2.3.4 9.9.9.9 5.6.7.8 # 1 0 1
SISMEMBER blacklist:ip:missing 1.2.3.4 # 0:键不存在也不报错
SCARD blacklist:ip # 2:集合基数
SREM blacklist:ip 1.2.3.4 # 1:移除成员相关命令对比
| 命令 | 作用 | 注意事项 |
|---|---|---|
| SISMEMBER | 单成员判断 | O(1),最常用的判断入口 |
| SMISMEMBER | 批量成员判断 | 6.2 起支持,顺序与入参一致 |
| SCARD | 集合元素个数 | 判断规模是否超出设计预期 |
| SADD | 添加成员 | 成员已存在时不会重复写入 |
| SREM | 移除成员 | 返回实际删除的数量 |
键不存在时返回 0 而不是报错,逻辑上等价于「名单为空」。因此空名单与非空名单可以使用同一套判断路径,不必额外做 EXISTS 检查。
名单类集合要评估基数:百万级成员的单键内存不小,而且成员集中在同一键上不利于集群拆分,必要时按业务前缀或时间维度分片。集合的过期只能整键设置,不能给单个成员设 TTL,需要成员级过期就改用 ZSet 存时间戳。
用循环 SISMEMBER 做批量判断会把往返放大 N 倍,同样逻辑应换成一次 SMISMEMBER;但升级前先确认目标实例版本不低于 6.2,否则命令不存在。