首页/数据/数据库速查/SISMEMBER / SMISMEMBER 成员判断
Redis 命令96 条

SISMEMBER / SMISMEMBER 成员判断

判断成员是否存在:SISMEMBER 单个返回 1/0,SMISMEMBER(6.2+)一次判断多个,结果按序返回 0/1 数组。

数据库速查数据更新于 2026-10-13

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,否则命令不存在。

易错点

  • 批量判断时循环调用 SISMEMBER:N 次往返把脚本延迟放大
  • 在 6.2 以下环境使用 SMISMEMBER:命令不存在,调用直接失败
  • 把键不存在当作名单加载失败:返回 0 属于正常语义
  • 拿一个大集合代替多个业务集合:单键过大既影响集群分布也增加运维成本
  • 把「先判断再添加」当成原子操作:SISMEMBER 与 SADD 之间仍有竞态,幂等发放应依赖 SADD 的返回值或 Lua

数据来源与参考

  • Redis 官方文档: SISMEMBER
  • Redis 官方文档: SMISMEMBER

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌