首页/数据/数据库速查/EXISTS 键存在性判断
Redis 命令96 条

EXISTS 键存在性判断

返回存在的键个数:单个键返回 0/1,多个键返回存在数量(同一个键写多次会重复计数);4.0 起语义从布尔改为计数。

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

存在性判断是什么

键存在性判断返回存在的键的数量:单个键返回零或一,多个键返回存在的数量。它从四点零版本开始语义发生了变化,从布尔判断改成计数,因此同一个键写两次会返回二——这不是缺陷而是设计。判断存在之后紧跟着读或写并不是原子操作,需要条件语义时必须用单条命令完成。

基本信息

用途判断键是否存在
语法存在性命令 键 [键 ...]
返回值存在的键个数,重复出现的键各计一次
复杂度每个键常数时间
语义变化四点零起由布尔改为计数
典型用途幂等判断、缓存预热校验、批量存在性检查

典型使用场景

  • 缓存预热前校验键是否已经存在
  • 幂等判断:先确认业务键是否存在再决定是否处理
  • 批量检查一批键是否都已写入
  • 排查数据缺失:确认键是被删除还是从未写入
  • 过滤无效请求:键不存在时直接返回默认值
  • 与条件写入配合:确认某个键已经被成功创建

示例

示例
SET k1 v1   # 写入一个键
EXISTS k1   # 返回 1
EXISTS k1 k2 k3   # 返回 1,只有 k1 存在
EXISTS k1 k1   # 返回 2,重复键各计一次
EXISTS k2   # 返回 0,键不存在或已过期

返回情况读法

场景返回含义
单个键存在1键存在
单个键不存在0键不存在或已过期
多个键部分存在存在的数量只能拿到数量,不区分具体哪个
同一键重复出现按出现次数计数属计数语义,不是缺陷
键已过期0过期后等同于不存在
键类型不符仍返回 1存在性判断与类型无关
判断存在之后再执行读或写不是原子的:需要「不存在才写」用条件写入的单条命令,需要「存在才写」用对应的条件选项,两步组合在并发下都会失效。
键已经过期时判断结果与不存在一致,业务上无法区分「从未写入」与「写入后过期」;需要区分时应额外记录写入标记。
用存在性判断加普通写入两步实现互斥,是分布式锁实现里最常见的错误:并发下两个请求都会通过判断,必须使用单条条件写入命令。

存在性判断检查清单

  • 判断结果只表示存在,不表示类型正确
  • 需要原子语义时用单条条件写入命令
  • 批量判断用一次命令传多个键,减少往返
  • 区分不存在与已过期,必要时另设标记
  • 高频判断的场景考虑把结果缓存到本地
  • 用于幂等控制时确认业务能容忍短暂不一致
过期键在被访问或被后台清理之前可能仍占用内存,存在性判断已按过期处理,但内存水位要看淘汰与清理情况,两件事不能混为一谈。
存在性判断常用于缓存预热与健康检查:批量校验时用一次命令传多个键,不必逐个发起请求;但返回值只有数量,需要知道具体缺哪个键时仍要单独判断。

易错点

  • 把重复键返回多值当成缺陷:计数语义下同一键写两次返回二,逻辑判断应先去重
  • 用判断加写入两步实现互斥:并发下两个请求都通过判断,必须改用单条条件写入命令
  • 用判断结果代替类型检查:键存在但类型不符时判断依然成功,读取时才会报类型错误
  • 用多个键的存在数量代替逐个确认:只拿到数量,无法知道具体缺哪个,排查时应传入单个键
  • 认为过期键会立刻从内存消失:清理有延迟,内存紧张时先到的是淘汰或告警

数据来源与参考

  • Redis 官方文档: EXISTS

相关工具

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