RedissonClient妙用-分布式布隆过滤器

news2024/9/23 1:39:33

目录

布隆过滤器介绍

布隆过滤器的落地应用场景

高并发处理 

多个过滤器平滑切换

分析总结


布隆过滤器介绍

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。

它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

什么业务场景需要使用这个布隆过滤器呢?我个人觉得是对误判数据不敏感。比如,在一个质检系统中,客服人员对重复的录音是非常敏感的,至于少了一些录音,对他们来说是无所谓的。

刚刚好,我们使用布隆过滤器对录音文件名进行过滤,布隆过滤器返回true的时候,我们把这部分录音给丢弃掉,返回false的时候,这部分数据就入库。而布隆过滤器返回false的时候,说明这个数据是100%不存在的,满足我们的应用场景。

布隆过滤器的落地应用场景

过滤代码

package com.tml.mouseDemo.service;

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import java.time.Duration;

/**
 * 分布式布隆过滤器的实现
 */
@Service
@Slf4j
public class BloomFilterService {

    @Autowired
    private RedissonClient redissonClient;

    private RBloomFilter bloomFilter;

    @PostConstruct
    public void init() {
        //参数:布隆过滤器的名字
        bloomFilter = redissonClient.getBloomFilter("repeatAudioFileName");
        // 初始化布隆过滤器  预计数据量   误判率
        boolean b = bloomFilter.tryInit(50000L, 0.03);

        log.info("repeatAudioFileName bloomFilter tryInit :{}", b);
    }


    public boolean checkFileNameRepeat(String audioFileName) {
        if (!StringUtils.hasText(audioFileName)) {
            throw new NullPointerException("audioFileName is empty");
        }

        //通过setNx的原子操作,保证在多个布隆过滤器之间有一个平滑的过度
        boolean setIfAbsent = redissonClient.getBucket(audioFileName).setIfAbsent("1", Duration.ofHours(1));
        if (!setIfAbsent) {
            log.info("this file is repeat!");
            return true;
        }

        boolean contains = bloomFilter.contains(audioFileName);
        if (!contains) {
            boolean add = bloomFilter.add(audioFileName);
            log.info("checkFileNameRepeat not contain:{} add:{}", audioFileName, add);
            //添加失败,说明过滤器中已经存在这个元素了
            return !add;
        }
        return true;
    }

}

代码说明

高并发处理 

contains()和add()是两个操作,在多线程并发条件下,需要结合这两个方法的返回值来综合判断,是不是布隆过滤器包含这个元素。

多个过滤器平滑切换

setIfAbsent()这个操作是一个更加严谨的操作,考虑到实际场景中是有多个布隆过滤器的,在第一个布隆过滤器和第二个布隆过滤器进行切换的时候,怎么做到平滑的切换呢?

比如,我们的应用场景中,每天都会创建一个布隆过滤器,而录音的数据是源源不断的推送过来的,但是我们录音数据有一个特点是,相同的录音的数据可能会多次推送,并且多次的最大间隔不会超过1小时

假设repeatAudioFileName-20240206这个过滤器中已经包含了某个录音文件A,刚刚好时间到了20230207这天,需要重新创建布隆过滤器,在repeatAudioFileName-20240207这个过滤器中,恰好又有相同的文件进来了需要判断,在新的过滤器中刚好没有这个文件,这个时候,又会将录音A文件入库,这个就是业务异常了。

优化后的方案如下

优化的方案的代码就是如上

对应的压测代码也发一下

    @Test
    public void testRedis() throws InterruptedException {


        int threadSize = 100;
        String fileName = "sagfdsfgewfgdsghf25870.mkv";
        long start = System.currentTimeMillis();
        CyclicBarrier cyclicBarrier = new CyclicBarrier(threadSize);
        CountDownLatch countDownLatch = new CountDownLatch(threadSize);
        for (int i = 0; i < threadSize; i++) {
            new Thread(() -> {
                try {
                    cyclicBarrier.await();
                    boolean b = bloomFilterService.checkFileNameRepeat(fileName);
                    log.info("checkFileNameRepeat----------:{}", b);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }
            }, "repeat_test_" + i).start();

        }

        countDownLatch.await();

        long end = System.currentTimeMillis();

        log.info("start:{}-- cost:{} ms", start, (end - start));



    }

分析总结

布隆过滤器有对应的优缺点,是不是使用你们的业务场景,需要想清楚。上面的案例中,之所以不用数据库的唯一约束,是因为我们使用了sharding-jdbc分库分表,相同的文件名的数据对应的订单id不一样,也不是在一个表中,不好控制。

顺便说一下,布隆过滤器的应用场景还是很广泛的,在以太坊ETH底层实现中,就用了布隆过滤器。

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

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

相关文章

Android Studio安装过程遇到SDK无法安装问题解决

首次打开studio遇到该类问题&#xff0c;需要下载SDK文件&#xff0c;后又发现SDK由于是Google源&#xff0c;无法进行正常安装&#xff0c;故转而进行SDK的镜像安装。 一、下载SDK Tools 地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio…

华为第二批难题一:基于预训练AI模型的元件库生成

我的理解&#xff1a;华为的这个难道应该是想通过大模型技术&#xff0c;识别元件手册上的图文内容&#xff0c;与现有建库工具结合&#xff0c;有潜力按标准生成各种库模型。 正好&#xff0c;我们正在研究&#xff0c;利用知识图谱技术快速生成装配模型&#xff0c;其中也涉…

微调LLM或使用RAG,开发RAG管道的12个痛点

论文地址&#xff1a;archive.is/bNbZo Pain Point 1: Missing Content 内容缺失 Pain Point 2: Missed the Top Ranked Documents 错过排名靠前的文档 Pain Point 3: Not in Context — Consolidation Strategy Limitations 不在上下文中 — 整合战略的局限性 Pain Point …

DBNet详解及训练ICDAR2015数据集

论文地址&#xff1a;https://arxiv.org/pdf/1911.08947.pdf 开源代码pytorch版本&#xff1a;GitHub - WenmuZhou/DBNet.pytorch: A pytorch re-implementation of Real-time Scene Text Detection with Differentiable Binarization 前言 在这篇论文之前&#xff0c;文字检…

【龙年大礼】| 2023中国开源年度报告!

【中国开源年度报告】由开源社从 2015 年发起&#xff0c;是国内首个结合多个开源社区、高校、媒体、风投、企业与个人&#xff0c;以纯志愿、非营利的理念和开源社区协作的模式&#xff0c;携手共创完成的开源研究报告。后来由于一些因素暂停&#xff0c;在 2018 年重启了这个…

香港倾斜模型3DTiles数据漫游

谷歌地球全香港地区倾斜摄影数据&#xff0c;通过工具转换成3DTiles格式&#xff0c;将这份数据完美加载到三维数字地球Cesium上进行完美呈现&#xff0c;打造香港地区三维倾斜数据覆盖&#xff0c;完美呈现香港城市壮美以及维多利亚港繁荣景象。再由12.5米高分辨率地形数据&am…

Java完整版宿舍管理

项目技术&#xff1a; springboot layui idea mysql5.7 jdk1.8 maven3 有需要该项目的小伙伴可以私信我你的Q。 功能描述&#xff1a; &#xff08;1&#xff09;基本信息管理 基本信息分为学生信息和宿舍信息两部分&#xff0c;其功能是负责维护这些信息&#xff0c…

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(二)

gnome-builder创建的程序&#xff0c;在工程树中有三个重要程序&#xff1a;main主程序、application应用程序和window主窗口程序。main整个程序的起始&#xff0c;它会操作application生产应用环境&#xff0c;application会操作window生成主窗口&#xff0c;于是就有了 appli…

【前端模板】bootstrap5披萨餐厅网站Pizza King平台(电商适用,附源码)

一、需求分析 披萨餐厅网站是指由披萨餐厅创建和维护的在线平台&#xff0c;旨在提供与该餐厅相关的信息和服务。以下是一些常见的功能和内容&#xff0c;可以在披萨餐厅网站上找到&#xff1a; 餐厅介绍&#xff1a;网站通常会提供有关餐厅的背景信息&#xff0c;包括其历史、…

VMwawre配置静态ip

1、查看当前虚拟机网关&#xff08;记住这个网关&#xff0c;后面使用&#xff09; 2、进入目录命令&#xff1a;cd /etc/sysconfig/network-scripts/ 3、编辑网卡配置文件命令&#xff1a;vim ifcfg-ens33 4、配置静态IP&#xff0c;修改和增加如下信息&#xff1a; 修改的内…

Vue3编写简单的App组件(二)

一、Vue3页面渲染基本流程 1、入口文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"><meta name"viewport" content"widthde…

vivo发布2023 年度科技创新;阿里全新AI代理,可模拟人类操作手机

vivo 发布 2023 年度十大产品技术创新 近日&#xff0c;vivo 发布了「2023 年度科技创新」十大产品技术创新榜单&#xff0c;并将这些技术分为了 4 个板块。 「四大蓝科技」为 vivo 在去年推出的全新技术品牌&#xff0c;涵盖蓝晶芯片技术栈、蓝海续航系统、蓝心大模型、蓝河操…

【Linux】Shell编程

Shell编程 目录 Shell编程1.shell基础1.输入重定向 & 输出重定向2.管道3.特殊字符(3.1)通配符(3.2)引号(3.3)注释符(#) 4.别名5.命令历史history 2.Shell脚本Shell脚本的执行方式(1)为脚本文件加上可执行权限,然后在命令行直接输入shell脚本文件名执行。(2)sh shell脚本名(…

redis之布隆过滤

目录 1、redis之布隆过滤 2、布隆过滤器原理 3、布隆过滤器使用步骤 初始化bitmap 添加占坑位 判断是否存在圜 1、redis之布隆过滤 布隆过滤&#xff1a;有一个初值都为0的bit数组和多个哈希函数构成&#xff0c;用来快速判断集合中是否存在某个元素。目的&#xff1a;减…

【深度学习】pytorch 与 PyG 安装(pip安装)

【深度学习】pytorch 与 PyG 安装&#xff08;pip安装&#xff09; 一、PyTorch安装和配置&#xff08;一&#xff09;、安装 CUDA&#xff08;二&#xff09;、安装torch、torchvision、torchaudio三个组件&#xff08;1&#xff09;下载镜像文件&#xff08;2&#xff09;创建…

华为第二批难题五:AI技术提升六面体网格生成自动化问题

有CAE开发商问及OCCT几何内核的网格方面的技术问题。其实&#xff0c;OCCT几何内核的现有网格生成能力比较弱。 HybridOctree_Hex的源代码&#xff0c;还没有仔细去学习。 “HybridOctree_Hex”的开发者说&#xff1a;六面体网格主要是用在数值模拟领域的&#xff0c;比如汽车…

智慧自助餐饮系统(SpringBoot+MP+Vue+微信小程序+JNI+ncnn+YOLOX-Nano)

一、项目简介 本项目是配合智慧自助餐厅下的一套综合系统&#xff0c;该系统分为安卓端、微信小程序用户端以及后台管理系统。安卓端利用图像识别技术进行识别多种不同菜品&#xff0c;识别成功后安卓端显示该订单菜品以及价格并且生成进入小程序的二维码&#xff0c;用户扫描…

Kubernetes基础(十五)-k8s网络通信

1 k8s网络类型 2 Pod网络 2.1 同一pod内不同容器通信 Pod是Kubernetes中最小的可部署单元&#xff0c;它是一个或多个紧密关联的容器的组合&#xff0c;这些容器共享同一个网络命名空间和存储卷&#xff0c;因此Pod中的所有容器都共享相同的网络命名空间和IP地址——PodIP&a…

JavaScript实现轮播图方法

效果图 先来看下效果图&#xff0c;嫌麻烦就不用具体图片来实现了&#xff0c;主要是理清思路。&#xff08;自动轮播&#xff0c;左右按钮切换图片&#xff0c;小圆点切换图片&#xff0c;鼠标移入暂停轮播&#xff0c;鼠标移出继续轮播&#xff09; HTML 首先是html内容&am…

获取视频帧图片

在实现了minio文件上传的基础上进行操作 一、编写pom <dependency><groupId>org.jcodec</groupId><artifactId>jcodec</artifactId><version>0.2.5</version> </dependency> <dependency><groupId>org.jcodec<…