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

也可以自行下载!

bash 复制代码
# 1.解压
 tar -zxvf v2.2.1.tar.gz
# 2. make一下
cd RedisBloom-2.2.1/
make

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

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

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

bash 复制代码
# 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
  1. 布隆过滤器的基本使用
bash 复制代码
# 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帮助类

java 复制代码
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.接口示例编写

java 复制代码
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);
    }

}
相关推荐
qq_12498707532 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
2301_818732062 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
此生只爱蛋3 小时前
【Redis】主从复制
数据库·redis
汤姆yu6 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶6 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
biyezuopinvip7 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
惊讶的猫7 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
JavaGuide7 小时前
一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!
java·spring boot
期待のcode7 小时前
Redis的主从复制与集群
运维·服务器·redis