redis8.0新特性:布谷鸟过滤器(Cuckoo Filter)详解

文章目录

  • 一、写在前面
  • 二、使用
    • 1、CF.RESERVE 创建布谷鸟过滤器
    • 2、CF.ADD 添加元素
    • 3、CF.ADDNX 不存在才添加
    • 4、CF.COUNT 判断元素添加次数
    • 5、CF.DEL 删除一次元素
    • 6、CF.EXISTS 判断元素是否存在
    • 7、CF.MEXISTS 批量判断元素是否存在
    • 8、CF.INFO 查看布谷鸟过滤器信息
    • 9、CF.INSERT 创建并添加元素
    • 10、CF.INSERTNX 不存在则添加
    • 11、CF.SCANDUMP 保存过滤器
    • 12、CF.LOADCHUNK 恢复保存的过滤器
  • 三、默认值
    • 1、cf-bucket-size
    • 2、cf-initial-size
    • 3、cf-expansion-factor
    • 4、cf-max-expansions
    • 5、cf-max-iterations
  • 四、其他
    • 1、关于布谷鸟过滤器删除操作引发的思考

一、写在前面

官方中文文档:https://redis.ac.cn/docs/latest/develop/data-types/probabilistic/cuckoo-filter/

布谷鸟过滤器是一种概率数据结构,用于检查元素是否存在于集合中

布谷鸟过滤器,就像布隆过滤器一样,是 Redis 开源版中的一种概率数据结构,它可以以非常快速且节省空间的方式检查元素是否存在于集合中,同时还支持删除操作,并在某些场景下表现优于布隆过滤器。

对比维度布隆过滤器布谷鸟过滤器
数据更新特性仅支持插入和查询,删除需特殊变体(如计数布隆)原生支持高效插入、查询和删除
空间效率中等,误判率相同时空间占用比布谷鸟高约40%高,相同误判率下空间利用率更高
适合数据类型静态或低频更新数据动态频繁更新数据
并发性能哈希函数独立,适合硬件并行需原子操作支持,但并发读写效率更高
典型误判影响误判可能导致“漏查”(正常数据被误判不存在)误判可能导致“错查”(不存在数据被误判存在)
硬件适配性适合FPGA/ASIC加速(位运算简单)适合CPU缓存优化(哈希表结构更紧凑)

二、使用

1、CF.RESERVE 创建布谷鸟过滤器

# 语法# capacity
#过滤器的预估容量。
#容量向上取整到下一个 2^n 数。
#过滤器很可能无法完全填充到其容量的 100%。如果您想避免扩展,请确保预留额外的容量。#BUCKETSIZE bucketsize
#每个桶中的项目数。
#较高的桶大小值可以提高填充率,但也会导致更高的错误率和稍微慢的性能。
#bucketsize 是一个介于 1 到 255 之间的整数。默认值为 2。# MAXITERATIONS maxiterations
#在声明过滤器已满并创建附加过滤器之前,在桶之间交换项目的尝试次数。
#较低的值有利于性能,较高的值有利于过滤器填充率。
#maxiterations 是一个介于 1 到 65535 之间的整数。默认值为 20。# EXPANSION expansion
#创建新过滤器时,其大小是当前过滤器大小乘以 expansion。
#expansion 是一个介于 0 到 32768 之间的整数。默认值为 1。
#扩展值向上取整到下一个 2^n 数。CF.RESERVE key capacity [BUCKETSIZE bucketsize]  [MAXITERATIONS maxiterations] [EXPANSION expansion]

创建一个空的 Cuckoo 过滤器,其中包含一个用于初始指定容量的子过滤器。

根据 Cuckoo 过滤器的行为,过滤器在达到 capacity 之前很可能声明自己已满;因此,填充率很可能永远无法达到 100%。通过使用更大的 bucketsize 可以提高填充率,但会以更高的错误率为代价。当过滤器自身声明 full 时,它将通过生成额外的子过滤器来进行自动扩展,但这会降低性能并增加错误率。新的子过滤器的大小等于前一个子过滤器的大小乘以 expansion。与桶大小一样,额外的子过滤器会线性地增加错误率。

使用桶大小为 1 时,最小的误报率约为 2/255 ≈ 0.78%。较大的桶会线性地增加错误率(例如,桶大小为 3 会导致 2.35% 的错误率),但可以提高过滤器的填充率。

maxiterations 指定了尝试为传入指纹找到插槽的次数。一旦过滤器满了,较高的 maxIterations 值将减慢插入速度。

在可能的情况下,会自动使用先前子过滤器中未使用的容量。过滤器最多可以增长 32 倍。

redis> CF.RESERVE cf 1000
OK
# 不允许重复创建
redis> CF.RESERVE cf 1000
(error) ERR item existsredis> CF.RESERVE cf_params 1000 BUCKETSIZE 8 MAXITERATIONS 20 EXPANSION 2
OK

2、CF.ADD 添加元素

Cuckoo 过滤器可以多次包含相同的元素,并将每次添加视为独立操作。使用 CF.ADDNX 仅在元素不存在时添加它。

# 语法
CF.ADD key item# 示例 可以重复添加
redis> CF.ADD cf item1
(integer) 1
redis> CF.ADD cf item1
(integer) 1

3、CF.ADDNX 不存在才添加

# 语法 如果元素不存在,则将项目添加到 Cuckoo 过滤器中。
CF.ADDNX key item

此命令类似于 CF.EXISTS 和 CF.ADD 命令的组合。如果元素已存在,则不会将元素添加到过滤器中。
注意
此命令比 CF.ADD 慢,因为它首先检查元素是否存在。
由于 CF.EXISTS 可能会产生误报,CF.ADDNX 可能不会添加某个元素(因为它被认为已经存在),这可能是错误的。

redis> CF.ADDNX cf item
(integer) 1
# 不能重复添加
redis> CF.ADDNX cf item
(integer) 0

4、CF.COUNT 判断元素添加次数

# 语法 返回给定项被添加到布谷鸟过滤器中的次数的估计值。
CF.COUNT key item

返回值为整数,其中正值是 item 被添加到过滤器中的次数的估计值。可能存在高估,但不会低估。0 表示 key 不存在或 item 未被添加到过滤器中。

redis> CF.INSERT cf ITEMS item1 item2 item2
1) (integer) 1
2) (integer) 1
3) (integer) 1
redis> CF.COUNT cf item1
(integer) 1
redis> CF.COUNT cf item2
(integer) 2

5、CF.DEL 删除一次元素

# 语法
CF.DEL key item

从过滤器中删除一个项目一次。

如果该项目只存在一次,它将从过滤器中移除。如果该项目被添加了多次,它仍然会存在。

注意!删除一个不在过滤器中的项目可能会误删其他项目,导致漏报。

redis> CF.INSERT cf ITEMS item1 item2 item2
1) (integer) 1
2) (integer) 1
3) (integer) 1
redis> CF.DEL cf item1
(integer) 1
redis> CF.DEL cf item1
(integer) 0
redis> CF.DEL cf item2
(integer) 1
redis> CF.DEL cf item2
(integer) 1
redis> CF.DEL cf item2
(integer) 0

6、CF.EXISTS 判断元素是否存在

# 语法,返回值为整数,其中 1 表示 item !很可能!已经添加到过滤器中,而 0 表示 key 不存在或 item 未添加到过滤器中。
CF.EXISTS key item# 示例
redis> CF.ADD cf item1
(integer) 1
redis> CF.EXISTS cf item1
(integer) 1
redis> CF.EXISTS cf item2
(integer) 0

7、CF.MEXISTS 批量判断元素是否存在

# 语法
CF.MEXISTS key item [item ...]# 示例
redis> CF.INSERT cf ITEMS item1 item2
1) (integer) 1
2) (integer) 1
redis> CF.MEXISTS cf item1 item2 item3
1) (integer) 1
2) (integer) 1
3) (integer) 0

8、CF.INFO 查看布谷鸟过滤器信息

# 语法
CF.INFO key# 示例
redis> CF.INFO cf1) Size2) (integer) 10803) Number of buckets4) (integer) 5125) Number of filter6) (integer) 17) Number of items inserted8) (integer) 09) Number of items deleted
10) (integer) 0
11) Bucket size
12) (integer) 2
13) Expansion rate
14) (integer) 1
15) Max iteration
16) (integer) 20

9、CF.INSERT 创建并添加元素

向布谷鸟过滤器(cuckoo filter)中添加一个或多个元素,如果过滤器尚不存在,可以指定自定义容量进行创建。

# 语法# 如果 key 不存在,则会创建一个新的布谷鸟过滤器。#CAPACITY capacity
#如果过滤器尚不存在,则指定新过滤器的期望容量。
#如果过滤器已存在,则忽略此参数。
#如果过滤器尚不存在且未指定此参数,则会以模块级别的默认容量(即 1024)创建过滤器。# NOCREATE
#如果指定此选项,则在过滤器不存在时阻止自动创建(将返回错误)。
#此选项与 CAPACITY 互斥。CF.INSERT key [CAPACITY capacity] [NOCREATE] ITEMS item [item ...]
# 创建并添加元素
redis> CF.INSERT cf CAPACITY 1000 ITEMS item1 item2 
1) (integer) 1
2) (integer) 1# NOCREATE 不创建
redis> CF.INSERT cf1 CAPACITY 1000 NOCREATE ITEMS item1 item2 
(error) ERR not found# 指定容量
redis> CF.RESERVE cf2 2 BUCKETSIZE 1 EXPANSION 0
OK
redis> CF.INSERT cf2 ITEMS 1 1 1 1
1) (integer) 1
2) (integer) 1
3) (integer) -1
4) (integer) -1

10、CF.INSERTNX 不存在则添加

如果元素之前不存在,则向布谷鸟过滤器添加一个或多个项目;如果过滤器尚不存在,则可以指定自定义容量来创建过滤器。

此命令类似于 CF.ADDNX,但可以添加多个项目并指定容量。

# 语法#CAPACITY capacity
#指定新过滤器的期望容量,如果此过滤器尚不存在。
#如果过滤器已存在,则此参数将被忽略。
#如果过滤器尚不存在且未指定此参数,则使用模块级别的默认容量 1024 创建过滤器。#NOCREATE
#如果指定此项,则在过滤器不存在时阻止自动创建过滤器(此时会返回错误)。
#此选项与 CAPACITY 互斥。CF.INSERTNX key [CAPACITY capacity] [NOCREATE] ITEMS item [item ...]
# 创建过滤器并添加
redis> CF.INSERTNX cf CAPACITY 1000 ITEMS item1 item2 
1) (integer) 1
2) (integer) 1
# 不允许重复添加元素
redis> CF.INSERTNX cf CAPACITY 1000 ITEMS item1 item2 item3
1) (integer) 0
2) (integer) 0
3) (integer) 1
# NOCREATE 不会创建过滤器
redis> CF.INSERTNX cf_new CAPACITY 1000 NOCREATE ITEMS item1 item2 
(error) ERR not found

11、CF.SCANDUMP 保存过滤器

开始对布谷鸟过滤器进行增量保存。

此命令对于无法容纳于DUMP和RESTORE模式的大型布谷鸟过滤器非常有用。

首次调用此命令时,iter的值应为 0。

此命令返回连续的(iter, data)对,直到(0, NULL)表示完成。

# 语法
CF.SCANDUMP key iterator
redis> CF.RESERVE cf 8
OK
redis> CF.ADD cf item1
(integer) 1
redis> CF.SCANDUMP cf 0
1) (integer) 1
2) "\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x01\x008\x9a\xe0\xd8\xc3\x7f\x00\x00"
redis> CF.SCANDUMP cf 1
1) (integer) 9
2) "\x00\x00\x00\x00\a\x00\x00\x00"
redis> CF.SCANDUMP cf 9
1) (integer) 0
2) (nil)
redis> DEL bf
(integer) 1
redis> CF.LOADCHUNK cf 1 "\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x01\x008\x9a\xe0\xd8\xc3\x7f\x00\x00"
OK
redis> CF.LOADCHUNK cf 9 "\x00\x00\x00\x00\a\x00\x00\x00"
OK
redis> CF.EXISTS cf item1
(integer) 1
# python代码
chunks = []
iter = 0
while True:iter, data = CF.SCANDUMP(key, iter)if iter == 0:breakelse:chunks.append([iter, data])# Load it back
for chunk in chunks:iter, data = chunkCF.LOADCHUNK(key, iter, data)

12、CF.LOADCHUNK 恢复保存的过滤器

# 语法
CF.LOADCHUNK key iterator data

三、默认值

1、cf-bucket-size

在 v8.0.0 中添加。

每个布谷鸟过滤器桶中的条目数。

类型:整数

有效范围:[1 … 255]

默认值:2

2、cf-initial-size

在 v8.0.0 中添加。

布谷鸟过滤器的初始容量。

类型:整数

有效范围:[2*cf-bucket-size .. 1048576]

默认值:1024

3、cf-expansion-factor

在 v8.0.0 中添加。

布谷鸟过滤器的扩展因子。

类型:整数

有效范围:[0 … 32768]

默认值:1

4、cf-max-expansions

布谷鸟过滤器的最大扩展次数。

类型:整数

有效范围:[1 … 65535]

默认值:32

5、cf-max-iterations

在 v8.0.0 中添加

布谷鸟过滤器的最大迭代次数。

类型:整数

有效范围:[1 … 65535]

默认值:20

四、其他

1、关于布谷鸟过滤器删除操作引发的思考

删除不存在的元素是否会导致其他元素被删除,取决于指纹冲突情况。布谷鸟过滤器的删除逻辑基于元素的指纹(fingerprint),而非完整元素值,因此存在以下风险:

  1. 指纹冲突的影响
    若元素A和元素B的指纹相同(哈希冲突),当删除不存在的元素A时,系统会根据哈希函数找到对应位置,若该位置存储的是元素B的指纹,则会误删元素B。
    • 示例:元素A(值为"apple")和元素B(值为"banana")的指纹均为0x123。若用户尝试删除A(实际不存在),过滤器会在哈希位置查找指纹0x123,若B的指纹存储在此处,则B会被错误删除。
  2. 删除的前提条件
    布谷鸟过滤器的删除操作需要确保元素确实存在,否则可能因指纹冲突导致误删。与布隆过滤器不同,布谷鸟过滤器支持删除,但依赖于准确的指纹匹配。

所以,布谷鸟过滤器虽然支持操作,但是仍然有一定的错误率,反而不支持删除操作的布隆过滤器还算比较精准了(删除时需要额外维护一个删除列表,如果存在的话需要额外判断删除列表中有没有)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/bicheng/86384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 Java秋招『面试避坑指南』:牛客网高频题分类精讲

前言 今天为大家整理了目前互联网出现率最高的大厂面试题,所谓八股文也就是指文章的八个部分,文体有固定格式:由破题、承题、起讲、入题、起股、中股、后股、束股八部分组成,题目一律出自四书五经中的原文。 初中级和中高级都有&#xff0c…

git安装使用和git命令大全

Git高速下载 程序员面试资料大全|各种技术书籍等资料-1000G Git 命令大全 一、基础操作 1. 初始化与克隆 命令说明示例git init初始化本地仓库git initgit clone克隆远程仓库git clone https://github.com/user/repo.gitgit remote add添加远程仓库git remote ad…

非常好用的markdown转pdf工具

在文档处理和知识管理中,Markdown因其简洁易读的特性而广受欢迎,而PDF格式则因其广泛的兼容性和稳定性而被广泛用于文档分享和存档。然而,将Markdown文档高效地转换为PDF格式,同时保留格式和样式,一直是许多用户的需求…

八股文——JAVA基础:基本数据类型与包装类的区别

基本数据类型包含八种, 1.用途不同,在目前编程而言,基本除了使用局部变量会使用基本数据类型外,都会去使用包装类。包装类能够适用泛型是目前企业编程使用包装类的主要原因,而基本类型不行。除此之外,包装…

从0开始学习R语言--Day30--函数型分析

在研究离散变量之间的影响时,我们往往只能获取类似中位数,平均数点来额外数据特点;但如果数据本身具有时间特性的话,我们可以尝试运用函数型分析,将静态的离散点转为动态过程来分析,即若本来是分析离散点对…

Agent轻松通-P3:分析我们的Agent

欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。 目录 1 引言2 使用工具分析Agent:”日志“…

如何将FPGA设计验证效率提升1000倍以上(1)

我们将以三个设计样例,助力您提升设计开发效率。 对于FPGA应用开发来说,代码是写出来的,更是调试出来的。软件仿真拥有最佳的信号可见性和调试灵活性,被大多数工程师熟练使用,能够高效捕获很多显而易见的常见错误。 …

RabbitMQ 利用死信队列来实现延迟消息

RabbitMQ 利用死信队列来实现延迟消息 基于 TTL(Time-To-Live) 死信队列(DLX)的方式来实现延迟消息 首先消息会被推送到普通队列中,该消息设置了TTL,当TTL到期未被消费掉,则会自动进入死信队列…

Keepalived+Haproxy+Redis三主三从

一、集群部署 1、案例拓扑 2、资源列表 主从节点是随机分配的,下属列表只是框架: 操作系统主机名配置IP应用OpenEuler24master12C4G192.168.10.101RedisOpenEuler24master22C4G192.168.10.102RedisOpenEuler24master32C4G192.168.10.103RedisOpenEule…

Modbus转IEC104网关:电力自动化系统的桥梁

现代电力系统中,变电站、发电厂以及配电网络中存在大量采用不同通信协议的设备。Modbus协议因其简单易用在现场设备中广泛部署,而电力行业主流监控系统则普遍采用IEC 60870-5-104(简称IEC104)协议。协议差异导致的数据孤岛现象&am…

@annotation:Spring AOP 的“精准定位器“

想象你是一位快递员,负责给一个大型社区送快递。社区里有几百户人家,但只有特定家庭需要特殊服务: 普通快递:直接放快递柜生鲜快递:需要冷藏处理贵重物品:需要本人签收药品快递:需要优先配送 …

Web Worker使用指南 解锁浏览器多线程 ,提升前端性能的利器

文章目录 前言一、什么是 Web Worker二、适用场景1、CPU 密集型计算2、图像/视频处理3、实时数据流处理(高频场景)4、后台文件操作5、复杂状态机/AI逻辑(游戏开发)6、长轮询与心跳检测7、WebAssembly 加速8、WebGL 与 Canvas 渲染…

React 18.2.0 源码打包

一、React源码地址 GitHub:React 二、参考文章 sourcemap实战-生成react源码sourcemap Rollup中文文档 JavaScript Source Map 详解 全网最优雅的 React 源码调试方式 三、打包操作 安装依赖 // 全局安装yarn npm i -g yarn // 源码项目目录下执行yarn安装依赖…

UniApp 开发第一个项目

UniApp 开发第一个项目全流程指南,涵盖环境搭建、项目创建、核心开发到调试发布,结合最新实践整理而成,适合零基础快速上手: 🧰 一、环境准备(5分钟) 安装开发工具 HBuilderX(官方推荐IDE):下载 App 开发版,安装路径避免中文或空格 微信开发者工具(调试小程序必备…

Web项目开发中Tomcat10+所需的jar包

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 项目背景 Web项目中使用低版本Tomcat时常用的jar包如下: javax.servlet-apijavax.ejb-apijavax.jms-apijavax.json-api 当Web项目使用Tomcat10的版本时&#…

网络安全就业方向与现实发展分析:机遇、挑战与未来趋势

网络安全行业的战略地位与就业背景 在数字经济蓬勃发展的今天,网络安全已从技术分支演变为关乎国家安全、企业存亡和个人隐私的核心领域。根据国家网信办数据显示,2025年我国网络安全人才缺口达200万人,较2023年增长33%。这一现象源于三重驱…

iOS runtime随笔-消息转发机制

运行时的消息转发分三步, 当你调用了没有实现的方法时, 有机会通过runtime的消息转发机制补救一下 resolveInstanceMethod/resolveClassMethod 这里可以动态去创建方法来解决CrashforwardingTargetForSelector ​​​​​第一步未解决, 就会走到这里, 可以给出一个Target去转发…

vue3用js+css实现轮播图(可调整堆叠程度)

先看效果 html <divclass"outer"style"width: 650px;background: #fff;box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.1);border-radius: 15px;margin: 0 10px 15px 5px;">//这里用的是svg-icon,需要的可自行替换为其他图片<svg-iconid"btn_l&q…

Three.js项目实战:从零搭建小米SU7三维汽车

大家如果有过购车的经验&#xff0c;肯定会先从网站上收集车辆的信息&#xff0c;比如懂车帝&#xff0c;汽车之家&#xff0c;这些网站上逼真的看车效果是如何实现的呢&#xff0c;这节课带你从0-1快速的手搓一个看车小项目。 懂车帝官网 效果 视频教程和笔记 大家可以下方小…

Android13 永久关闭SELinux 权限

永久关闭 SeLinux 在cmdline中增加参数androidboot.selinuxpermissive&#xff1b; 芯片: QCM6115 版本: Android 13 kernel: msm-4.19 ~/temp_code/SLM927D_LA.UM.9.15$ git diff device/qcom/bengal/BoardConfig.mk diff --git a/device/qcom/bengal/BoardConfig.mk b…