存在性判断是什么
键存在性判断返回存在的键的数量:单个键返回零或一,多个键返回存在的数量。它从四点零版本开始语义发生了变化,从布尔判断改成计数,因此同一个键写两次会返回二——这不是缺陷而是设计。判断存在之后紧跟着读或写并不是原子操作,需要条件语义时必须用单条命令完成。
基本信息
| 用途 | 判断键是否存在 |
|---|---|
| 语法 | 存在性命令 键 [键 ...] |
| 返回值 | 存在的键个数,重复出现的键各计一次 |
| 复杂度 | 每个键常数时间 |
| 语义变化 | 四点零起由布尔改为计数 |
| 典型用途 | 幂等判断、缓存预热校验、批量存在性检查 |
典型使用场景
- 缓存预热前校验键是否已经存在
- 幂等判断:先确认业务键是否存在再决定是否处理
- 批量检查一批键是否都已写入
- 排查数据缺失:确认键是被删除还是从未写入
- 过滤无效请求:键不存在时直接返回默认值
- 与条件写入配合:确认某个键已经被成功创建
示例
示例
SET k1 v1 # 写入一个键
EXISTS k1 # 返回 1
EXISTS k1 k2 k3 # 返回 1,只有 k1 存在
EXISTS k1 k1 # 返回 2,重复键各计一次
EXISTS k2 # 返回 0,键不存在或已过期返回情况读法
| 场景 | 返回 | 含义 |
|---|---|---|
| 单个键存在 | 1 | 键存在 |
| 单个键不存在 | 0 | 键不存在或已过期 |
| 多个键部分存在 | 存在的数量 | 只能拿到数量,不区分具体哪个 |
| 同一键重复出现 | 按出现次数计数 | 属计数语义,不是缺陷 |
| 键已过期 | 0 | 过期后等同于不存在 |
| 键类型不符 | 仍返回 1 | 存在性判断与类型无关 |
判断存在之后再执行读或写不是原子的:需要「不存在才写」用条件写入的单条命令,需要「存在才写」用对应的条件选项,两步组合在并发下都会失效。
键已经过期时判断结果与不存在一致,业务上无法区分「从未写入」与「写入后过期」;需要区分时应额外记录写入标记。
用存在性判断加普通写入两步实现互斥,是分布式锁实现里最常见的错误:并发下两个请求都会通过判断,必须使用单条条件写入命令。
存在性判断检查清单
- 判断结果只表示存在,不表示类型正确
- 需要原子语义时用单条条件写入命令
- 批量判断用一次命令传多个键,减少往返
- 区分不存在与已过期,必要时另设标记
- 高频判断的场景考虑把结果缓存到本地
- 用于幂等控制时确认业务能容忍短暂不一致
过期键在被访问或被后台清理之前可能仍占用内存,存在性判断已按过期处理,但内存水位要看淘汰与清理情况,两件事不能混为一谈。
存在性判断常用于缓存预热与健康检查:批量校验时用一次命令传多个键,不必逐个发起请求;但返回值只有数量,需要知道具体缺哪个键时仍要单独判断。