布隆过滤器原理及应用

news2024/11/26 3:11:18

使用场景

适用于数据命中不高、 数据相对固定、 实时性低(通常是数据集较大) 的应用场景。比如:

  1. 解决缓存穿透;
  2. 爬虫时记录已爬取的网页;
  3. 记录黑名单;

原理

数据结构是一个bit数组,布隆过滤器通过hash算法(无偏hash函数)将值换算成对应的bit位,并存入布隆过滤器。所谓无偏hash函数就是能够把元素的hash值算的比较均匀。
如果查询的值经过hash换算成值后在布隆过滤器没有找到对应的bit(存在一个bit位不匹配),表示该值一定不存在,如果找到了对应的匹配位,也不能确定该值一定存在,因为有可能是别的值占据了对应的bit(hash冲突)。
可以多次hash生成多个bit位,降低hash冲突概率。

值的存储示意图如下:

在这里插入图片描述

优缺点

优点

缓存空间占用很少,效率高。

缺点

  • 不支持删除

因为多个不同的数据对应的可能是同一组bit位,如果删除了一个数据bit位可能将其他的数据对应bit位也删除了。
可以通过维护一个counter对应bit位来支持删除。

  • 存在一定误差

判断某一个值存在,存在一定误差,因为hash碰撞导致不同值生成的哈希值相同,当某个不存在的值计算的hash值已存在,则得出的结论也是存在的。为了减少误差率,可以增加hash的次数和增加bit数组位的长度;

实现方式

redis

redis中的布隆过滤器,redis4.0之后加入了module,适合分布式场景。

引入redisson客户端:

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.6.5</version>
</dependency>

示例伪代码:

public class RedissonBloomFilter {

    public static void main(String[] args) {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://localhost:6379");
        // 构造Redisson
        RedissonClient redisson = Redisson.create(config);

        RBloomFilter<String> bloomFilter = redisson.getBloomFilter("nameList");
        // 初始化布隆过滤器:预计元素为100000000L(1亿),误差率为3%,根据这两个参数会计算出底层的bit数组大小
        bloomFilter.tryInit(100000000L, 0.03);
        // 将jay插入到布隆过滤器中
        bloomFilter.add("jay");

        // 判断下面号码是否在布隆过滤器中
        System.out.println(bloomFilter.contains("jolin")); // false
        System.out.println(bloomFilter.contains("kunlin")); // false
        System.out.println(bloomFilter.contains("jay")); // true
    }
}

使用布隆过滤器需要把所有数据提前放入布隆过滤器,并且在增加数据时也要往布隆过滤器里放,布隆过滤器缓存过滤伪代码:

// 初始化布隆过滤器
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("nameList");
// 初始化布隆过滤器:预计元素为100000000L(1亿),误差率为3%
bloomFilter.tryInit(100000000L,0.03);
        
// 把所有数据存入布隆过滤器
void init(){
    for (String key: keys) {
        bloomFilter.put(key);
    }
}

String get(String key) {
    // 从布隆过滤器这一级缓存判断下key是否存在
    Boolean exist = bloomFilter.contains(key);
    if(!exist){
        return "";
    }
    // 从缓存中获取数据
    String cacheValue = cache.get(key);
    // 缓存为空
    if (StringUtils.isBlank(cacheValue)) {
        // 从存储中获取
        String storageValue = storage.get(key);
        cache.set(key, storageValue);
        // 如果存储数据为空,需要设置一个过期时间(300秒)
        if (storageValue == null) {
            cache.expire(key, 60 * 5);
        }
        return storageValue;
    } else {
        // 缓存非空
        return cacheValue;
    }
}

注意:布隆过滤器不能删除数据,如果要删除得重新初始化数据。

guava

google的guava包实现了布隆过滤器,适合单机场景。

实际应用

抢单王通过布隆过滤器判断电子行业料号是否存在,不存在才继续流程。线上redis版本为2.8,不支持redis提供的布隆过滤器,通过guava来实现的,guava是google提供的java核心类库。

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

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

相关文章

Rx.NET in Action 中文介绍 前言及序言

Rx 处理器目录 (Catalog of Rx operators) 目标可选方式Rx 处理器(Operator)创建 Observable Creating Observables直接创建 By explicit logicCreate Defer根据范围创建 By specificationRangeRepeatGenerateTimerInterval Return使用预设 Predefined primitivesThrow …

【vue】alert弹窗太死板?试试这种方法(附代码)

alert(response.data.message); 新方法&#xff1a; this.$message.error(请检查您输入的的用户名和密码&#xff01;);

等保案例 2

用户简介 青海省司法厅是贯彻执行国际司法行政的方针、政策&#xff0c;拟定青海市司法行政工作的政策、法规的重要组织机构。青海省司法厅根据国家部署及业务需要先后简历了司法专网及行政办公网&#xff0c;目前两套网络之间完全物理隔离。但青海省司法厅现有网络设备单一&a…

学会这个小技巧,让你的Jenkins更好用

♥ 前 言 在使用 Jenkins 时&#xff0c;我们经常遇到这样的需求&#xff1a;在 Jenkins 构建的时候拉取指定分支的代码或者指定 tag 的代码&#xff0c;而 Jenkins 默认没有带这样的参数化选择功能&#xff0c;我们可以通过 Git Parameter 插件来实现。 一、准备&#xff…

公文管理系统SSM+Activiti文档文件日志java jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 公文管理系统SSMActiviti 系统有1权限&#xff1a;管…

达摩院FunASR实时语音听写服务软件包发布

7月初&#xff0c;FunASR社区发布了离线文件转写软件包&#xff0c;可以高精度、高效率、高并发的支持长音频离线文件转写&#xff0c;吸引了众开发者参与体验。应开发者需求&#xff0c;FunASR社区再次推出实时语音听写服务软件包&#xff0c;支持实时地进行语音转文字&#x…

如何进行网络活动监控

组织的 IT 基础架构中的每个网络设备上都发生了大量活动&#xff0c;例如数据包传输、来自网络协议的消息、设备状态事件等。网络活动成为在检测到问题时识别网络瓶颈的面包屑&#xff0c;因此即使是最微小的网络活动也应受到监控&#xff0c;因为它直接影响整体网络性能、运行…

Python web实战之Django的AJAX支持详解

关键词&#xff1a;Web开发、Django、AJAX、前端交互、动态网页 今天和大家分享Django的AJAX支持。AJAX可实现在网页上动态加载内容、无刷新更新数据的需求。 1. AJAX简介 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在网页上实现异步通信的技术。通过…

DHCPv6之GitHub项目Android侧验证

一、adb里面安装busybox 1、下载busybox 下载网址&#xff1a;Index of /downloads/binaries/1.21.1 (busybox.net)&#xff0c;目前最新是1.21.1版本 根据项目选择busybox-armv7l &#xff0c;右键另存为下载到本地目录&#xff0c;下载后去掉文件的后缀名&#xff0c;变成如…

MetaGPT-软件开发领域的重大变革

在不断发展的人工智能世界中&#xff0c;一个术语最近引起了人们的关注&#xff1a;MetaGPT。随着数字领域的竞争变得更加激烈&#xff0c;了解和利用 MetaGPT 的功能可以改变企业、开发人员和人工智能爱好者的游戏规则。本文深入探讨了 MetaGPT 的世界、其重要性及其对人工智能…

云服务监控解决方案

云监控是追踪、警报和报告性能指标的过程&#xff0c;目的是全面了解云服务和资源。应用程序管理器具有分析混合云和多云基础架构以及托管在其上的应用程序的性能所需的所有必要功能&#xff0c;它使管理员能够主动发现云服务的性能瓶颈&#xff0c;并在它们影响最终用户之前快…

优思学院|六西格玛黑带在公司中的人数应有多少?

6西格玛 (Six Sigma) 是一商业管理之战略模式。这套模式最初用于1986年&#xff0c;由摩托罗拉所创立&#xff0c;后来&#xff0c;在通用电气的CEO Jack Welch的大力推广之下&#xff0c;在1995年成为通用电气的核心管理思想。六西格玛现在被广泛应用于很多行业中&#xff0c;…

OneNote of win10登录个人账户,输入账号后,页面一直在转圈圈【已解决】

OneNote of win10登录个人账户&#xff0c;输入账号后&#xff0c;页面一直在转圈圈多种解决方式 1.win10 WLAN限制 在WLAN中找到能够使用WLAN的应用&#xff0c;把OneNote of win10打开。 2.关闭代理 ①关闭 VP* ②到 Windows 10 的设置里“网络和 Internet” →代理→把这…

9月大理,Move HackerHouse,成为全球数字游民的第一站

&#x1f680;世界各地的 hacker 们&#xff01;即日起&#xff0c;我们正式向您发出 co-buiding & co-living 的邀请&#xff01; 9.3日至9.24日&#xff0c;为期3周的 Move 主题Antalpha HackerHouse 将坐落于大理&#xff0c;邀请所有 Web3 开发者一起探索 Move 生态发…

初始多线程

目录 认识线程 线程是什么&#xff1a; 线程与进程的区别 Java中的线程和操作系统线程的关系 创建线程 继承Thread类 实现Runnable接口 其他变形 Thread类及其常见方法 Thread的常见构造方法 Thread类的几个常见属性 Thread类常用的方法 启动一个线程-start() 中断…

ROS新建工作区(workspace)与包(package)编译的实践(C++示例)

ROS工作区是用来存放ROS工作包的目录&#xff0c;这些工作包&#xff0c;包含了ROS程序的各种文件&#xff0c;包括源代码、配置文件、消息文件等。所以工作区的本质是一个文件夹&#xff0c;用来存放接下来将要介绍的包以及构建这些包所需的文件。ROS工作区可以新建很多&#…

drawio导出矢量图

1.选中要导出的图 2.导出为pdf 3.用adobe打开pdf&#xff0c;另存为eps

算法通关村第六关——原来如此简单

层次遍历&#xff1a;又叫广度优先遍历。就是从根节点开始&#xff0c;先访问根节点下面一层全部元素&#xff0c;再访问之后的层次&#xff0c;直到访问完二叉树的最后一层。 我们先看一下基础的层次遍历题&#xff0c;力扣102题&#xff1a;给你一个二叉树&#xff0c;请你返…

Android14新特性之语法性别API

Android14新特性之语法性别API 语法性别 API 为使用语法性别改变句子以根据受话人而变化的语言进行对话的用户提供了更加个性化、自然的语音体验。 例如法语中的语法&#xff1a; Chre cliente[女性]&#xff0c;cher client[男性] — 亲爱的客户 [英文] 语法性别 API 在 Andr…

文献综述|NLP领域后门攻击、检测与防御

前言&#xff1a;在信息安全中后门攻击&#xff08;Backdoor Attack&#xff09;是指绕过安全控制而获取对程序或系统访问权的方法。而随着深度学习以及各种神经网络模型的广泛应用&#xff0c;神经网络中存在的后门问题也引起了研究人员的广泛关注。神经网络后门攻击就是使网络…