SpringBoot+Redis的Bloom过滤器

1.保姆级Linux安装Redis

①把redis.tar.gz下载到linux中,并用命令tar -zxvf安装

②安装完成进入目录输入make进行编译,编译完成后输入make install 进行安装

③创建两个文件夹mkdir bin mkdir etc

将redis目录下的redis.conf文件移动到etc文件中:mv redis.conf etc

将redis目录下src目录中的mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-cli、redis-server文件移动到 bin文件夹中:mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server /root/home/softwear/redis-6.2.1/bin

④进入etc中打开redis.conf文件,修改配置(例如输入/daemonize查找按n键查找下一个):

  • 把文件中的daemonize属性改为yes(表明需要在后台运行)
  • 把 redis.conf配置文件中的 bind 127.0.0.1 这一行给注释掉,这里的bind指的是只有指定的网段才能远程访问这个redis,注释掉后,就没有这个限制了。
  • 把 redis.conf配置文件中的 protected-mode 设置成no(默认是设置成yes的, 防止了远程访问
  • 编辑 redis.conf配置文件,修改Redis默认密码 (默认密码为空)(1)在配置文件中找到这一行 # requirepass foobared(2)删除前面的注释符号#,并把foobared修改成自己的密码 或者 另起一行 requirepass 自己的密码

⑤设置Redis开机启动

进入:vi /etc/rc.d/rc.local

将bin目录下的/root/home/softwear/redis-6.2.1/bin/redis-server 和etc目录下的/root/home/softwear/redis-6.2.1/etc/redis.conf 添加到文件中

⑥进入redis下的bin目录 cd ~/home/softwear/redis-6.2.1/bin, 启动redis服务redis-server

启动成功!

注意:修改完Redis配置文件后启动时一定要加上配置文件,例如:redis-server redis.conf

⑦redis-server服务启动之后启动后启动客户端 redis-cli

redis-cli -h(地址) 127.0.0.1 -p(端口号) 6379 -a(密码) .....

2.Bloom过滤器安装

下载插件https://download.csdn.net/download/RHHcainiao/88652985

也可以自行下载!

# 1.解压
 tar -zxvf v2.2.1.tar.gz
# 2. make一下
cd RedisBloom-2.2.1/
make

2.安装完布隆过滤器后,去redis的配置文件中加载 redisbloom.so文件,在redis.conf中添加配置

#1.打开Redis的conf配置文件
vim redis/redis.conf
添加如下内容:
loadmodule /root/redis-6.2.5/RedisBloom-2.2.5/redisbloom.so

3.验证是否安装且成功配置布隆过滤器,先重启redis,然后使用布隆过滤器的 bf.add命令进行测试,返回1代表布隆过滤器配置完成

# 1.重启进入redis客户端
redis-server /usr/local/redis/redis.conf 
redis-cli -h(地址) 127.0.0.1 -p(端口号) 6379 -a(密码) .....
# 2.测试布隆过滤器命令,如果返回1说明布隆过滤器配置成功!
bf.add k1 test

3. 布隆过滤器的基本使用

# 1.清空redis数据库(测试用,慎重!)
flushall
# 2.添加
bf.add k1 helloRedis
# 3.判断是否存在
bf.exists k1 helloRedis
# 4.判断一个不存在的key value
bf.exists k2 helloJava
# 5.批量添加
bf.madd k2 a b c d e
# 6.批量判断
bf.mexists k2 a b c d e

3.Bloom简介

Bloom本质上是一种数据结构,特点是 高效的插入和查询,可用来判断存在或者不存在

直接上代码:

4.SpringBoot集成Bloom

1.添加依赖

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1-jre</version>
        </dependency>

2.编写Bloom帮助类

package com.rh.serviceproduct.bloom;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Component;

import java.nio.charset.Charset;

@Component
public class BloomFilterService {
    //Bloom容量100万(根据业务自定义)
    private static final int EXPECTED_INSERTIONS = 1000000;
    //误差率0.1%
    private static final double FPP = 0.001;

    //注入过滤器
    private BloomFilter<String> bloomFilter;


    /**
     * 初始化方法
     */
    @PostConstruct
    public void init() {
        //创建一个过滤器,容量100万,误差率0.1% 字符编码UTF-8
        bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.forName("UTF-8")), EXPECTED_INSERTIONS, FPP);
    }

    /**
     * 添加元素
     * @param value
     */
    public void add(String value) {
        bloomFilter.put(value);
    }

    /**
     * 是否存在元素
     * @param value
     * @return
     */
    public boolean mightContain(String value) {
        return bloomFilter.mightContain(value);
    }
}

3.接口示例编写

package com.rh.serviceproduct.controller;

import com.rh.model.vo.common.Result;
import com.rh.model.vo.common.ResultCodeEnum;
import com.rh.serviceproduct.bloom.BloomFilterService;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class TestController {
    //注入Redis客户端
    @Autowired
    private RedisTemplate<String,String>redisTemplate;
    //注入Bloom帮助类
    @Autowired
    private BloomFilterService bloomFilterService;

    @RequestMapping(value="/test")
    public Result findAll(){
        String findValue="";//定义一个最终返回值
        //1.定义key
        String redisKey="Hello:Bloom!";
       //2.判断是否存在Bloom过滤器
        if (!bloomFilterService.mightContain(redisKey)) {
            //3.如果不存在去查Redis
            if (!redisTemplate.hasKey(redisKey)){
                //4.如果redis都不在去查库
                System.out.println("查询数据库.........");
                //5.将数据存入redis,同步存入Bloom
                redisTemplate.opsForValue().set(redisKey,"value");
                bloomFilterService.add(redisKey);
            }
        }else {
            //6.key存在Bloom中,从Redis获取数据,防止Bloom误判(概率极低),再判断一遍Redis是否存在key
            if (!redisTemplate.hasKey(redisKey)){
                System.out.println("查询数据库.........");
                redisTemplate.opsForValue().set(redisKey,"value");
                bloomFilterService.add(redisKey);
            }
            findValue = redisTemplate.opsForValue().get(redisKey);
        }
        return Result.build(findValue, ResultCodeEnum.SUCCESS);
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

磁盘类型选择对阿里云RDS MySQL的性能影响

测试说明 这是一个云数据库性能测试系列&#xff0c;旨在通过简单标准的性能测试&#xff0c;帮助开发者、企业了解云数据库的性能&#xff0c;以选择适合的规格与类型。这个系列还包括&#xff1a; * 云数据库(RDS MySQL)性能深度测评与对比 * 阿里云RDS标准版(x86) vs 经济…

医院影像科PACS系统源码,医学影像系统,支持MPR、CPR、MIP、SSD、VR、VE三维图像处理

PACS系统是医院影像科室中应用的一种系统&#xff0c;主要用于获取、传输、存档和处理医学影像。它通过各种接口&#xff0c;如模拟、DICOM和网络&#xff0c;以数字化的方式将各种医学影像&#xff0c;如核磁共振、CT扫描、超声波等保存起来&#xff0c;并在需要时能够快速调取…

Verilog基础:时序调度中的竞争(二)(创建分频时钟时,使用阻塞赋值)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 作为一个硬件描述语言&#xff0c;Verilog HDL常常需要使用语句描述并行执行的电路&#xff0c;但其实在仿真器的底层&#xff0c;这些并行执行的语句是有先后顺序…

汽车制造厂设备故障预测与健康管理PHM

在现代汽车制造工业中&#xff0c;设备的可靠性和稳定性对于保证生产线的高效运行至关重要。为了提高生产效率、降低维修成本以及确保产品质量&#xff0c;汽车制造厂逐渐采用设备故障预测与健康管理&#xff08;PHM&#xff09;系统&#xff0c;以实现对设备状态的实时监测和预…

第11章 GUI Page411~420 步骤五 支持其他图形

运行效果&#xff1a; 源代码 //item_i.hpp 抽象“图形元素”接口定义 #ifndef ITEM_I_HPP_INCLUDED #define ITEM_I_HPP_INCLUDED#include <wx/gdicmn.h> #include <wx/dc.h>class IItem { public://作为接口&#xff0c;记得要有虚析构virtual ~IItem(){}//使用…

linux静态ip配置方法(vmware虚拟机)

1、背景 自己搭建了一个虚拟机&#xff0c;vmware虚拟机&#xff0c;如果使用动态ip,经常变换地址&#xff0c;登录不方便。 优点&#xff1a; 静态网络配置的好处是该服务器地址是静态ip的&#xff0c;不会随着网络更换而出现波动。 2、配置方法 2.1 进入centos系统&#…

算法与数据结构--散列表与哈希算法

引入 我们知道c的set和unorder_set&#xff08;map本质上也是set&#xff0c;就是把set的存储对象换成键值对结构体&#xff09;&#xff0c;set底层是红黑树实现的&#xff0c;那么unorder_set是怎么实现的呢&#xff1f;这一节就来讲讲实现unorder_set的哈希表&#xff0c;也…

量化交易学习笔记:XGBoost 在量化选股中的应用

一、引言 本篇文章通过借鉴传统机器学习算法——XGBoost——对相同的量价因子进行实验&#xff0c;方便与深度学习模型进行对比实践。 二、算法介绍 XGBoost 是在 Gradient Boosting&#xff08;梯度提升&#xff09;框架下实现的机器学习算法&#xff0c;全称为“极限梯度提…

css 实现满屏升空的气球动画

问题一 怎么实现满屏气球&#xff1f;简单理解就是多个气球的合并&#xff0c;难道要写多个盒子吗&#xff1f;确实是这样子&#xff0c;但可以有更好的办法&#xff0c;其实就是通过原生操作多个盒子生成&#xff0c;所以只需要实现一个颜色、大小、位置可自定义的气球即可。…

AngularJS

理解实现代码的逻辑为主要&#xff0c;代码怎么写为次要。 参考资料&#xff1a; 《AngularJS入门与进阶》&#xff0c;江荣波著 前端开发常用框架 React&#xff1a;由Facebook开发&#xff0c;用于构建用户界面的JavaScript库&#xff0c;以组件化和虚拟DOM著称。 Angular&…

牦牛角划破眼睑,幼儿紧急就医抢救眼睛

前几天深夜&#xff0c;成都爱尔眼科医院收治了一位患儿&#xff0c;年仅2岁&#xff0c;被父亲抱在怀中与邻居一起从西藏来到成都。因孩子父亲无法用普通话交流&#xff0c;医生从邻居口中了解孩子无意间右眼被牦牛角击中眼皮断裂了。在当地医院接受检查&#xff0c;但无法实施…

锐捷配置PVLAN

一、实验拓扑 二、实验目的 PVLAN可以通过主VLAN和辅助VLAN的概念&#xff0c;部署隔离技术&#xff0c;实现用户间的互访控制。 三、实验配置 SW2 Ruijie >enable Ruijie #configure terminal Ruijie (config)#vlan 20 Ruijie (config-vlan)#private-vlan community …

4.使用 Blazor 构建 Web 应用程序

微软官方培训 了解如何通过 Blazor Web 用户界面框架构建你的第一个 Web 应用程序。 https://learn.microsoft.com/zh-cn/training/paths/build-web-apps-with-blazor/?viewaspnetcore-8.0 8个模块 目录 微软官方培训 1.使用 Blazor 进行 Web 开发的简介 2.使用 Blazor…

【网络技术】BGP 基础与概述

该笔记主要作用与 BGP 路由协议的基础和概述讲解&#xff0c;其萌芽作用 参考视频&#xff1a;红茶三杯 关键词阐述&#xff1a;AS 独立自治网络系统机构 前置知识 在我们学习 BGP 路由之前所学习的所有动态路由策略&#xff0c;都同属一个路由类中&#xff1a;IGP BGP 路由协…

为什么越来越多公司开始用低代码开发?

时代洪流的走向&#xff0c;我们无法左右&#xff0c;能够把握的&#xff0c;只有做好自己。如何在寒冬来之不易的机会中&#xff0c;生存并且壮大。 不知道大家有没有发现&#xff0c;今年的低代码赛道异常火热&#xff0c;但火热的背后才值得思考&#xff0c;市场需求持续被挖…

信号与线性系统翻转课堂笔记7——信号正交与傅里叶级数

信号与线性系统翻转课堂笔记7——信号正交与傅里叶级数 The Flipped Classroom7 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff0c;重点&a…

音视频类App广告变现如何破局,最大化广告变现收益,让应用增收?

音视频App已然成为了我们日常获取、发布和交换信息的重要方式&#xff0c;在音视频行业不断的拓展中&#xff0c;用户的渗透率提升。 据数据显示&#xff0c;我国网络视听用户的规模已达9亿人次&#xff0c;网民使用率也突破了90%。庞大的市场规模和用户需求吸引了大批开发者和…

[已解决] Ubuntu远程桌面闪退+登录显示“远程桌面由于数据加密错误 , 这个会话将结束“

两个月前&#xff0c;由于跑代码在Ubuntu配置环境&#xff0c;乱七八糟的下载了很多东西&#xff0c;导致了一系列问题..... 问题1 Ubuntu远程桌面闪退 实验室有两台服务器&#xff0c;IP后三位分别为141和142&#xff0c;其中141在输入密码后立即闪退&#xff0c;142可以正常…

Open3D点云处理简明教程

推荐&#xff1a;用NSDT编辑器快速搭建可编程3D场景 这是“激光雷达入门”文章的延续。 在这篇文章中&#xff0c;我们将查看用于处理点云的 python 库和 Open3D 数据结构&#xff0c;执行可视化并操作点云数据&#xff0c;以便进行后续的分析处理。 如果你需要快速预览3D点云…

不明觉厉,Meta宣布了Fairy——快速并行指令引导视频到视频合成

Meta 刚刚宣布了Fairy——一项快速并行指令引导视频到视频合成的创新技术。这一引入图像编辑扩散模型的简约而强大的改进&#xff0c;极大地增强了其视频编辑应用程序的性能。 他们的方法聚焦于基于锚的跨帧注意力的概念&#xff0c;这是一种隐式跨帧传播扩散特征的机制&#…