布隆过滤器 redis

news2024/9/24 21:25:59

一.为什么要用到布隆过滤器?

缓存穿透:查询一条不存在的数据,缓存中没有,则每次请求都打到数据库中,导致数据库瞬时请求压力过大,多见于爬虫恶性攻击

因为布隆过滤器是二进制的数组,如果使用了它,可以把需要的对应的全量业务数据的key值全放到布隆过滤器中,内存占用较小,这样就不会击穿数据库

二.数据访问流程

布隆过滤器–>redis缓存–>数据库
1. 布隆过滤器如果不存在,直接返回,不访问缓存和数据库
2. 布隆过滤器有,如果缓存有,直接返回数据
3. 布隆过滤器有,如果缓没有,查数据库

三.原理:

在这里插入图片描述

使用二进制数组,对要存入的key进行多次hash,分配到数组的不同位置,数组的值从0改成1,查询的时候也进行多次hash,命中到数组的位置的值都是1则key可能存在,如果有一个不是1则key一定不存在
在这里插入图片描述

四.缺点

缺点1:

存在误判的情况,比如:hello和你好经过hash后的值一样,出现hash冲突。比如“你好”是存在,“hello”不存在,但他们的hash值一样,就会通过
在这里插入图片描述
解决:

1.根据数据量大小设置误判率。误判率越小,使用的hash函数越多,hash冲突越小,但计算的时间增加,内存占用更多
2.增大布隆过滤器数组

缺点2:

删除困难: 布隆过滤器无法直接删除已添加的元素,因为删除操作会影响其他元素的判断结果。在删除元素时,可能会导致一些位置的位被置为 0,从而影响其他元素的判断结果,增加误判的概率

解决:

只能是重新载入布隆过滤器了。开发定时任务,每隔几个小时,自动创建一个新的布隆过滤器数组替换老的。注意,是几小时,这也就意味着,这一方法在高并发的情况下有巨大缺点

五.代码实践

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.27.2</version>
        </dependency>
import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * redisson客户端使用Bloom过滤器拦截无效请求,解决缓存穿透
 * 项目初始化的时候初始化布隆过滤器(例如把商品编号都放进去),
 * 用户发过来的请求(带商品编号)先经过布隆过滤器过滤,过滤掉的返回null
 *
 */
@Configuration
public class RedissinConfig {


   @Value("${redisson.address}")
   private String addressUrl;


    @Value("${redisson.password}")
    private String password;


    @Bean
    public RedissonClient redissonClient() {
    Config config = new Config();
    config.useSingleServer()
    .setAddress(addressUrl)
    .setRetryInterval(5000)
    .setTimeout(10000)
    .setDatabase(0)
    .setPassword(password)
    .setConnectTimeout(10000);
    return Redisson.create(config);
    }

    /**
     * 可以不注册成bean,直接使用redissonClient来创建Bloom过滤器
     * @param redissonClient
     * @return
     */
   @Bean
   public RBloomFilter<String> bloomFilter(RedissonClient redissonClient) {
      RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("bloom");
      bloomFilter.tryInit(1000000L, 0.01);
      return bloomFilter;
   }

}
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DataApplication.class)
@Slf4j
public class BloomTest {

    @Autowired
    private RedissonClient redissonClient;

    RBloomFilter<String> bloomFilter;

    @Before
    public void init()
    {
        bloomFilter = redissonClient.getBloomFilter("bloom");
        bloomFilter.tryInit(10000L, 0.01);
    }

    /**
     * 测试耗时和误判率
     */
    @Test
    public void test()
    {
        long start = System.currentTimeMillis();

        int total=10000;
        for (int i = 0; i < total; i++)
        {
            bloomFilter.add(String.valueOf(i));
        }
        long end= System.currentTimeMillis();
        log.info("插入用时:{}",end-start);
        int count = 0;
        for (int i = total; i < total+1000; i++)
        {
            if(bloomFilter.contains(String.valueOf(i))){
                count++;
                log.info("误判了:{}",i);
            }
        }
        log.info("插入用时:{}",System.currentTimeMillis()-end);
        log.info("count为:{},误判率:{}",count,(count*1.0/1000));
    }

    /**
     * 获取count
     */
    @Test
    public void countBloomTest()
    {

        long count = bloomFilter.count();
        log.info("count为:{}",count);
    }

    /**
     * 删除过滤器
     */
    @Test
    public void delBloomTest()
    {
        bloomFilter.delete();
    }


}

1万的数据插入差不多用了4分钟,查询1000个数据用了24秒
在这里插入图片描述
在redis可视化中看到的数据如下
在这里插入图片描述

在这里插入图片描述

六.源码解析

布隆过滤器初始化源码,保存的信息(size,hashIterations,expectedInsertions,falseProbability),跟上图匹配,计算位数组大小和哈希个数是数学计算公式
在这里插入图片描述
在这里插入图片描述

参考:
https://zhuanlan.zhihu.com/p/622044226

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

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

相关文章

小米手机短信怎么恢复?不用求人,3个技巧一网打尽

当你突然发现安卓手机里的重要短信不见了&#xff0c;是不是感到一阵心慌意乱&#xff1f;别急&#xff0c;不用求人&#xff0c;更不用焦虑。作为基本的社交功能&#xff0c;短信是我们与外界沟通的重要桥梁&#xff0c;当删除后&#xff0c;短信怎么恢复呢&#xff1f;今天&a…

Halcon 模糊圆边的找圆案例

Halcon 模糊圆边的找圆案例 基本思路 1.将图像转成灰度图像 2.再观察要找到的区域的灰度值变化&#xff0c;找到前景与背景的具体数值。 3.根据找到的前景与背景的具体数值&#xff0c;增强图像对比度。&#xff08;使图像变成黑白图片&#xff09; 4.使用灰度直图工具进行阈值…

ChatTTS使用

ChatTTS是一款适用于日常对话的生成式语音模型。 克隆仓库 git clone https://github.com/2noise/ChatTTS cd ChatTTS 使用 conda 安装 conda create -n chattts conda activate chattts pip install -r requirements.txt 安装完成后运行 下载模型并运行 python exampl…

android13 固定U盘链接 SD卡链接 TF卡链接 硬盘链接

1.前言 有些客户使用的应用并不带有自动监听U盘 sd卡广播的代码,使用的代码是固定的地址,这样的话,就需要我们将系统的挂载目录固定了。 原始路径 /storage/3123-19FA 增加链接 /storage/upan_000 -> /storage/3123-19FA 2. 首先如果是应用本身监听的话,使用的是 /…

美容美发在线预约小程序源码系统 前后端完整分离 带完整的安装代码包以及搭建教程

系统概述 在当今这个快节奏的社会&#xff0c;美容美发服务已经成为人们日常生活中不可或缺的一部分。为了满足广大消费者的便捷预约需求&#xff0c;以及美容美发行业的数字化转型趋势&#xff0c;一款高效、易用、功能全面的在线预约小程序显得尤为重要。今天&#xff0c;我…

纷享销客荣获CDIE“2024优秀数字化技术服务商”

近日&#xff0c;在第十届数字化创新博览会&#xff08;CDIE 2024&#xff09;上&#xff0c;CRM品牌领导者纷享销客凭借其卓越的技术实力和创新的解决方案&#xff0c;荣获“2024 优秀数字化技术服务商”奖项。 作为国内领先的CRM数字化解决方案服务商&#xff0c;纷享销客一直…

白盒测试的概念、特点、应用阶段、实施流程、现状与前景

文章目录 前言一、白盒测试的应用阶段二、白盒测试的特点三、白盒测试的流程四、白盒测试的现状与前景总结 前言 白盒测试&#xff08;White Box Testing&#xff09;&#xff0c;又称为结构测试&#xff08;Structural Testing&#xff09;、透明盒测试&#xff08;Glass Box…

循环练习 while

public static void main(String[] args) {double money100000;int count0;while(money>1000){if (money>50000){moneymoney-money*0.05;count;}else if (money>1000){money-1000;count;}else {break;}}System.out.println(count);} 结果为&#xff1a;

ggplot2绘图点的形状不够用怎么办?

群里有这么一个问题&#xff1a; 请问老师&#xff0c;fviz_pca_ind 做pca&#xff0c;当设置geom.ind “point”&#xff0c;group>6时&#xff0c;就不能显示第7&#xff0c;8组的点&#xff0c;应该如何处理&#xff08;在不设置为文本的情况下&#xff09;&#xff0c;…

如何为IP申请SSL证书

目录 以下是如何轻松为IP地址申请SSL证书的详细步骤&#xff1a; 申请IP证书的基本条件&#xff1a; 申请IP SSL证书的方式&#xff1a; 确保网络通信安全的核心要素之一&#xff0c;是有效利用SSL证书来加密数据传输&#xff0c;特别是对于那些直接通过IP地址访问的资源。I…

部署Harbor镜像仓库并在k8s配置使用

文章目录 一、下载所需软件包1.docker-compose2.harbor 二、安装docker-compose1.安装docker2.配置docker-compose 三、安装harbor1.编辑harbor配置文件2.加载harbor配置&#xff08;重新加载配置文件&#xff0c;只要修改配置文件就需要执行&#xff09;3.开始安装harbor4.doc…

谷歌正在试行人脸识别办公室安全系统

内容提要&#xff1a; &#x1f9ff;据美国消费者新闻与商业频道 CNBC 获悉&#xff0c;谷歌正在为其企业园区安全测试面部追踪技术。 &#x1f9ff;测试最初在华盛顿州柯克兰的一间办公室进行。 &#x1f9ff;一份内部文件称&#xff0c;谷歌的安全和弹性服务 (GSRS) 团队将…

Windows版PostgreSQL数据库下载及安装教程(关系型数据库管理系统)

前言 PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统&#xff08;RDBMS&#xff09;。PostgreSQL最初设想于1986年&#xff0c;当时被叫做Berkley Postgres Project。该项目一直到1994年都处于演进和修改中&#xff0c;直到开发人员Andrew Yu和…

免费也能做高端!教育资源数据可视化,这款神器让你事半功倍

传统教育模式下&#xff0c;教育资源的分配、学生的学习进度、教师的教学质量等关键信息往往隐藏在海量的数据之中&#xff0c;难以被直观理解和有效利用。可视化技术为这些数据插上了翅膀&#xff0c;让它们以图表、图像、动画等形式跃然屏上&#xff0c;一目了然。 山海鲸可视…

云计算【第一阶段(27)】DHCP原理与配置以及FTP的介绍

一、DHCP工作原理 1.1、DHCP概念 动态主机配置协议 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff0c;该协议允许服务器向客户端动态分配 IP 地址和配置信息。 DHCP协议支持C/S&#xff08;客户端/服务器&#xff09;结构&…

telegram Bot 设置左下角的菜单按钮

我们在和BotFather对话的时候发现它的左下角有个菜单按钮&#xff0c;而且里面有很多命令&#xff0c;这个是怎么实现的了&#xff1f;接着往下看 也不知道CSDN是什么问题&#xff0c;关于telegram的几篇文章都没有审核通过&#xff0c;有想法了解更多的可以去我的博客南锋去看…

bdeaver mysql忘记localhost密码修改密码添加用户

描述 bdeaver可以连接当前的localhost数据库&#xff0c;但不知道数据库密码是什么。用这个再建一个用户&#xff0c;用来连接数据库 解决 1、在当前的数据库localhost右键&#xff0c;创建-用户 设置这个用户&#xff0c;密码 加权限 2、连接 用新的账号密码去连接&#x…

油烟监测仪:守护厨房,让蓝天白云成为常态

夏日炎炎&#xff0c;白天的酷暑让人们更加向往夜晚的凉爽与惬意。在这样的季节里&#xff0c;品尝各式烧烤、小龙虾&#xff0c;再搭配一杯冰镇啤酒&#xff0c;成为了许多市民夜晚消遣的不二选择。然而&#xff0c;随之而来的餐饮油烟问题也进入了高发阶段&#xff0c;对周边…

elastic job3 使用

​ 运维篇 运维平台地址&#xff1a;apache/shardingsphere-elasticjob: Distributed scheduled job (github.com)下载下来后&#xff0c;跑起 shardingsphere-elasticjob-lite-ui-frontend和shardingsphere-elasticjob-lite-ui-backend即可 原理片&#xff1a; 失效转移&am…

springboot在线智能助考系统-计算机毕业设计源码00068

摘要 随着人工智能技术的快速发展&#xff0c;智能辅助学习系统在教育领域日益受到重视。本研究旨在基于GPT构建在线智能助考系统&#xff0c;结合先进的自然语言处理技术&#xff0c;为用户提供智能问答、模拟考试、资源分享、交流论坛等功能&#xff0c;旨在提升用户学习效率…