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);
    }

}
相关推荐
杨运交5 小时前
[041][公共模块]分布式唯一ID生成器设计与实现:一款灵活可扩展的雪花算法框架
spring boot
用户30745969820720 小时前
Redis 延时队列详解
redis
烤代码的吐司君1 天前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
Flittly1 天前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
Flynt2 天前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
掉鱼的猫3 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
leeyi3 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent
人活一口气4 天前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc
云技纵横4 天前
一个 @Async 让循环依赖暴雷:Spring 代理的暗坑
redis
犯困蛋挞yy5 天前
用Claude快速解决Redis代码报错反复无解的问题
redis