*Redis CF.MEXISTS 命令
CF.MEXISTS 检查一个或多个元素是否存在于 Cuckoo Filter 中。
*语法
CF.MEXISTS key item [item ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Cuckoo Filter 的键名 |
| item... | String / Bytes | 是 | 要检查的一个或多个元素 |
*返回值
返回一个整数数组,每个元素对应一个检查操作的结果:
- 1:元素很可能已被添加到过滤器中(存在假阳性可能)
- 0:键不存在,或元素肯定未被添加到过滤器中
特殊情况: - Simple error reply:参数无效、键类型错误或键未找到时返回
*时间复杂度
O(k * n),其中 k 是子过滤器数量,n 是待检查元素数量。
*示例
*基本用法
> CF.INSERT cf ITEMS item1 item2
1) (integer) 1
2) (integer) 1
> CF.MEXISTS cf item1 item2 item3
1) (integer) 1
2) (integer) 1
3) (integer) 0
*检查不存在的键
> CF.MEXISTS nonexistent item1
1) (integer) 0
*批量检查多个元素
> CF.INSERT cf_users ITEMS alice bob charlie
1) (integer) 1
2) (integer) 1
3) (integer) 1
> CF.MEXISTS cf_users alice bob dave eve
1) (integer) 1
2) (integer) 1
3) (integer) 0
4) (integer) 0
*检查已删除的元素
> CF.INSERT cf_del ITEMS item1
1) (integer) 1
> CF.DEL cf_del item1
(integer) 1
> CF.MEXISTS cf_del item1
1) (integer) 0
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 参数数量不足 | 至少提供一个键名和一个元素 |
| ERR not found | 键不存在 | 返回值 0,无需报错;如需检查请确保过滤器已创建 |
| ERR item exists | 键已存在但不是 Cuckoo Filter 类型 | 使用不同的键名,或删除现有键 |
*最佳实践
- 批量检查:CF.MEXISTS 支持一次检查多个元素,比多次调用 CF.EXISTS 更高效,减少网络往返
- 理解假阳性:返回 1 并不保证元素一定被插入过,只是"很可能"存在。假阳性率取决于过滤器的 Bucket size 和容量配置
- 假阳性率估算:默认 Bucket size 为 2 时,假阳性率约为 0.78%(2/255)。更大的 Bucket size 会提高假阳性率但改善填充率
- 与 CF.INSERTNX 配合使用:CF.INSERTNX 先检查再插入,因此也会受到假阳性影响。如果去重准确性至关重要,建议用 Redis Set 作为辅助确认
- 不存在为确定性判断:返回 0 是确定性判断,即元素肯定未被添加。只有返回 1 时才存在假阳性可能
*FAQ
Q1: CF.MEXISTS 和 CF.EXISTS 有什么区别? A: CF.MEXISTS 支持一次检查多个元素,返回整数数组。CF.EXISTS 只检查单个元素,返回单个整数。两者在语义上完全一致,CF.MEXISTS 更适合批量检查场景。
Q2: 返回 1 表示元素一定存在吗? A: 不一定。Cuckoo Filter 是概率数据结构,返回 1 表示元素很可能存在(真阳性或假阳性)。返回 0 是确定性判断,表示元素肯定不存在。假阳性率取决于过滤器的配置参数。
Q3: 如何降低假阳性率? A: 可以通过以下方式降低假阳性率:1) 使用更大的过滤器容量;2) 使用更小的 Bucket size(最小为 1);3) 使用更少的子过滤器(避免多次扩展)。注意这些调整通常以牺牲填充率或性能为代价。
Q4: 如果键不存在,CF.MEXISTS 会报错吗? A: 不会。如果键不存在,CF.MEXISTS 返回数组,所有元素对应的结果都是 0。这与键存在但元素未插入的情况一致。
Q5: 删除后的元素还能被检测到吗? A: 如果元素被成功删除(CF.DEL 返回 1),后续 CF.MEXISTS 检查应该返回 0。但注意 Cuckoo Filter 的删除操作有一定限制,如果删除不存在的元素可能导致错误删除其他元素的指纹(false deletion)。