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

这篇具有很好参考价值的文章主要介绍了RedissonClient妙用-分布式布隆过滤器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

布隆过滤器介绍

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

高并发处理 

多个过滤器平滑切换

分析总结


布隆过滤器介绍

布隆过滤器(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文件入库,这个就是业务异常了。

RedissonClient妙用-分布式布隆过滤器,java,分布式,布隆过滤器,Redisson,以太坊,大数据量去重

优化后的方案如下

RedissonClient妙用-分布式布隆过滤器,java,分布式,布隆过滤器,Redisson,以太坊,大数据量去重

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

对应的压测代码也发一下

    @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底层实现中,就用了布隆过滤器。文章来源地址https://www.toymoban.com/news/detail-831768.html

到了这里,关于RedissonClient妙用-分布式布隆过滤器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【分布式】分布式存储架构

    说到分布式存储,我们先来看一下传统的存储是怎么个样子。 传统的存储也称为集中式存储, 从概念上可以看出来是具有集中性的,也就是整个存储是集中在一个系统中的,但集中式存储并不是一个单独的设备,是集中在一套系统当中的多个设备,比如下图中的 EMC 存储就需

    2024年02月10日
    浏览(49)
  • 分布式 - 谈谈你对分布式的理解,为什么引入分布式?

    不啰嗦,我们直接开始! 真正了解分布式系统的概念,日后工作中具有分布式系统设计思想。 能否在设计中对系统稳定性方面考虑周全。 能构建高 QPS 健壮的系统架构。 问题分析: 各种分布式框架层出不穷,Spring Cloud,阿里的 Dubbo,无论使用哪一个,原理都相同,考察下基

    2024年02月15日
    浏览(47)
  • 高级分布式系统-第15讲 分布式机器学习--分布式机器学习算法

    高级分布式系统汇总:高级分布式系统目录汇总-CSDN博客 按照通信步调,大致可以分为同步算法和异步算法两大类。 同步算法下,通信过程中有一个显式的全局同步状态,称之为同步屏障。当工作节点运行到 同步屏障 ,就会进入等待状态,直到其工作节点均运行到同步屏障

    2024年01月18日
    浏览(43)
  • 分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)

    什么是分布式 一个系统各组件分别部署在不同服务器。彼此通过网络通信和协调的系统。 也可以指多个不同组件分布在网络上互相协作,比如说电商网站 也可以一个组件的多个副本组成集群,互相协作如同一个组件,比如数据存储服务中为了数据不丢失而采取的多个服务备

    2024年04月11日
    浏览(46)
  • Redis与分布式-分布式锁

    接上文 Redis与分布式-集群搭建 为了解决上述问题,可以利用分布式锁来实现。 重新复制一份redis,配置文件都是刚下载时候的不用更改,然后启动redis服务和redis客户。 redis存在这样的命令:和set命令差不多,但是它有一个机制,当指定的key不存在的时候,才能进行插入,实

    2024年02月07日
    浏览(46)
  • 【分布式】分布式共识算法 --- RAFT

    CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance) It states, that though its desirable to have Consistency, High-Availability and Partition-tolerance in every system, unfortunately no system can achieve all three at the same time. 在分布式系

    2024年02月06日
    浏览(47)
  • 分布式爬虫架构-对等分布式(2)

    前言 本文是该专栏的第45篇,后面会持续分享python爬虫干货知识,记得关注。 在面对海量数据的采集需求时,使用分布式爬虫是非常有必要的。继上一篇,详细介绍主从分布式爬虫架构,对主从分布式相关知识感兴趣的同学,可往前翻阅。而本文,笔者再单独来详细介绍分布

    2023年04月25日
    浏览(52)
  • 【分布式】分布式事务:2PC

    分布式事务的问题可以分为两部分: 并发控制 concurrency control 原子提交 atomic commit 分布式事务问题的产生场景:一份数据被分片存在多台服务器上,那么每次事务处理都涉及到了多台机器。 可序列化(并发控制): 定义了事务执行的正确性 真正地并行执行事务,获得真正的

    2024年02月09日
    浏览(45)
  • (快手一面)分布式系统是什么?为什么要分布式系统?分布式环境下会有哪些问题?分布式系统是如何实现事务的?

    《分布式系统原理与泛型》中这么定义分布式系统: “ 分布式系统是若干独立计算机的集合, 这些计算机对于用户来说就像单个相关系统 ”, 分布式系统(distributed system)是建立在网络之上的软件系统。 就比如:用户在使用京东这个分布式系统的时候,会感觉是在使用一

    2024年02月08日
    浏览(67)
  • 分布式系统架构设计之分布式数据存储的扩展方式、主从复制以及分布式一致性

    在分布式系统中,数据存储的扩展是为了适应业务的增长和提高系统的性能。分为水平扩展和垂直扩展两种方式,这两种方式在架构设计和应用场景上有着不同的优势和局限性。 水平扩展是通过增加节点或服务器的数量来扩大整个系统的容量和性能。在数据存储领域,水平扩

    2024年02月03日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包