Redis 布隆过滤器的正确使用方式

Redis 的布隆过滤器是一种高效的概率型数据结构,适用于检测一个元素是否属于一个集合。虽然它有一定的误判率(即可能错误地认为一个不存在的元素在集合中),但不会漏报(即实际存在的元素一定不会被错过)。由于其空间和时间效率较高,布隆过滤器特别适用于以下场景:

适用场景

  1. 缓存穿透防御

    • 场景描述:用户请求的数据不在缓存中,会直接访问数据库,造成缓存穿透。
    • 应用:在查询缓存前,先使用布隆过滤器判断数据是否存在,若不存在,则直接返回,不访问数据库。比如电商网站的商品信息缓存。
  2. 防止重复提交

    • 场景描述:提交相同的数据可能造成不必要的处理或业务逻辑错误。
    • 应用:可以在布隆过滤器中记录已经处理的请求,如果有重复的请求,则直接过滤掉。
  3. 数据去重

    • 场景描述:大型数据集下的重复数据校验。
    • 应用:在接收和处理大流量数据时,布隆过滤器可以用于快速判断数据是否重复,例如爬虫抓取的 URL 去重和邮件处理系统中过滤重复邮件。
  4. 分布式系统中的请求过滤

    • 场景描述:多个服务节点在处理相同请求时需要保持一致性。
    • 应用:在分布式数据库或缓存系统中,在每个节点前都可以放置布隆过滤器,所有节点共享一个过滤器,确保请求不被重复处理。
  5. 防止垃圾邮件

    • 场景描述:频繁出现的垃圾邮件可能消耗极大的资源。
    • 应用:使用布隆过滤器存储已见过的有效邮件地址,如果下次检测到相同的邮件地址,可以快速识别,不再处理。
  6. 推荐系统中的快速校验

    • 场景描述:推荐系统需要迅速验证某个对象是否已经被推荐。
    • 应用:比如视频推荐系统,可以使用布隆过滤器存储已经推荐的视频 ID,防止重复推荐。
  7. 字典查找

    • 场景描述:海量数据集合中快速判断某单词是否存在。
    • 应用:比如拼写检查、DNA 序列检测、病毒签名检测等。
  8. 黑名单过滤

    • 场景描述:需要快速验证某个元素是否在黑名单中。
    • 应用:如安全系统中的 IP 黑名单过滤,技术上可以先基于布隆过滤器进行过滤,再进一步审查。

布隆过滤器的优点与缺点

优点:
  1. 空间效率高:相比于其他数据结构,如哈希表,布隆过滤器在空间利用率上有很大的优势。
  2. 时间效率高:布隆过滤器的插入和查询速度都非常快,可以达到常数时间复杂度。
  3. 可扩展性好:布隆过滤器很容易扩展,可以添加更多的哈希函数和位数组来减小误判率。
缺点:
  1. 误判率:布隆过滤器会有误判率,即可能错误地认为一个不存在的元素在集合中,但不会漏报。
  2. 无法删除元素:标准布隆过滤器不支持删除元素,一旦插入,就不能删除,这有可能使误判率增加(尽管可以通过计数式布隆过滤器解决)。
  3. 较复杂的哈希函数设计:布隆过滤器需要设计多个哈希函数,以平衡误判率和空间利用率。

具体实现和应用实例

通过 Redis 的布隆过滤器,你可以非常方便地实现上述场景。例如,电商网站可以使用它防止缓存穿透,爬虫系统可以利用它进行 URL 去重,邮件系统可以通过它快速识别垃圾邮件。

前提条件

Redis 提供了布隆过滤器的实现,可以通过 RedisBloom 模块来使用。以下是如何在 Spring Boot 项目中集成 Redis 的布隆过滤器的详细示例。

  • 安装 Redis 和 RedisBloom 模块。可以通过以下命令安装 RedisBloom:

    redis-server --loadmodule /path/to/redisbloom.so
    

1. 添加依赖

首先,在 pom.xml 中添加 Redis 和 RedisBloom 客户端的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>io.rebloom</groupId>
        <artifactId>rebloom</artifactId>
        <version>4.2.0</version>
    </dependency>
</dependencies>

2. 配置 Redis

application.ymlapplication.properties 文件中配置 Redis 连接信息:

spring:
  redis:
    host: localhost
    port: 6379

3. 创建 RedisBloom 配置

创建一个配置类,用于初始化 RedisBloom 客户端:

import io.rebloom.client.Client;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;

@Configuration
public class RedisConfig {

    @Bean
    public StringRedisTemplate redisTemplate(RedisConnectionFactory factory) {
        return new StringRedisTemplate(factory);
    }

    @Bean
    public Client redisBloomClient(RedisConnectionFactory factory) {
        return new Client(factory.getConnection().getNativeConnection());
    }
}

4. 使用布隆过滤器

创建一个服务类,使用布隆过滤器进行操作:

import io.rebloom.client.Client;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BloomFilterService {

    @Autowired
    private Client redisBloomClient;

    private final String filterName = "url-filter";

    public void add(String item) {
        redisBloomClient.add(filterName, item);
    }

    public boolean exists(String item) {
        return redisBloomClient.exists(filterName, item);
    }
}

5. 创建控制器

创建一个控制器,通过 HTTP 接口来操作布隆过滤器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/bloom")
public class BloomFilterController {

    @Autowired
    private BloomFilterService bloomFilterService;

    @PostMapping("/add")
    public String addItem(@RequestParam String item) {
        bloomFilterService.add(item);
        return "Item added";
    }

    @GetMapping("/exists")
    public boolean checkItem(@RequestParam String item) {
        return bloomFilterService.exists(item);
    }
}

6. 运行和测试

启动 Spring Boot 应用,并通过以下命令测试布隆过滤器:

# 添加项到布隆过滤器
curl -X POST 'http://localhost:8080/bloom/add?item=testItem'

# 检查项是否存在
curl -G 'http://localhost:8080/bloom/exists?item=testItem'
# 返回值应为 true

# 检查不存在的项
curl -G 'http://localhost:8080/bloom/exists?item=nonExistentItem'
# 返回值应为 false

小结

Redis 的布隆过滤器是一种高效、空间友好的数据结构,适用于各类需要快速判断元素是否存在的场景。通过合理配置和使用 Redis 的布隆过滤器,能够显著提升系统的性能和可靠性,同时减少资源的浪费。

然后再通过上述步骤,你实现了一个基于 Redis 的布隆过滤器服务。在这个例子中,我们使用 RedisBloom 模块来创建和操作布隆过滤器。主要步骤包括:

  1. 添加必要的依赖。
  2. 配置 Redis 和 RedisBloom 客户端。
  3. 创建服务类,使用 RedisBloom 的接口进行操作。
  4. 创建控制器,通过 HTTP 接口暴露布隆过滤器的功能。

这种方法高效而且易于扩展,适用于需要快速判断元素是否存在于某个大型集合中的场景。

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

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

相关文章

Pyserial设置缓冲区大小失败

文章目录 问题描述原因分析解决方案 问题描述 使用set_buffer_size()设置缓冲区大小后&#xff0c;buffer size仍为默认的4096 import time import serial ser serial.Serial(baudrate9600, timeout0.5) ser.port COM1 ser.set_buffer_size(rx_size8192) ser.open() while …

无线传感器网络(物联网通信技术)期末考试2024年真题

目录 WSN期末复习资料 第一章&#xff1a;概述 第二章MAC协议 第三章路由协议 第四章时间同步技术 第五章定位技术 第六章安全技术 第七章拓扑控制 补充TPSN、HRTS公式推导 2024年期末考试考点 一、简述 二、考试真题回忆 WSN期末复习资料 第一章&#xff1a;概述 …

基于SpringBoot的校园台球厅人员与设备管理系统

本系统是要设计一个校园台球厅人员与设备管理系统&#xff0c;这个系统能够满足校园台球厅人员与设备的管理及用户的校园台球厅人员与设备管理功能。系统的主要功能包括首页、个人中心、用户管理、会员账号管理、会员充值管理、球桌信息管理、会员预约管理、普通预约管理、留言…

15集终于编译成功了-了个球!编译TFLite Micro语音识别工程-《MCU嵌入式AI开发笔记》

15集终于编译成功了-个球&#xff01;编译TFLite Micro语音识别工程-《MCU嵌入式AI开发笔记》 还是参考这个官方文档&#xff1a; https://codelabs.developers.google.cn/codelabs/sparkfun-tensorflow#2 全是干货&#xff01; 这里面提到的这个Micro工程已经移开了&#xff1…

第一节 网络安全概述

一.网络空间安全 网络空间&#xff1a;一个由信息基础设施组成相互依赖的网络。 ---- 海陆空天&#xff08;大海、陆 地、天空、航天&#xff09; 通信保密阶段 ---- 计算机安全 ----- 信息系统安全 ----- 网络空间安全 计算机安全&#xff1a;开始秉持着“严于律己&#x…

数据结构速成--图

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 …

设计模式之状态机模式

一、状态机模式介绍 状态机模式&#xff08;State Machine Pattern&#xff09;是一种用于描述对象行为的软件设计模式&#xff0c;属于行为型设计模式。在状态机模式中&#xff0c;对象的行为取决于其内部状态&#xff0c;并且在不同的状态下&#xff0c;对象可能会有不同的行…

增强安全防护,解读智慧校园系统的登录日志功能

在构建智慧校园系统时&#xff0c;登录日志功能扮演着不可或缺的角色&#xff0c;它不仅是系统安全的守护者&#xff0c;也是提升管理效率和确保合规性的有力工具。这一机制详细记录每次登录尝试的方方面面&#xff0c;涵盖了时间戳、用户身份、登录来源的IP地址乃至使用的设备…

第2集《修习止观坐禅法要》

请打开补充讲表第一面&#xff0c;附表一、念佛摄心方便法。 我们前面讲到修止&#xff0c;就是善取所缘境的相貌&#xff0c;然后心于所缘&#xff0c;专一安住&#xff1b;心于所缘&#xff0c;相续安住&#xff1b;达到心一境性的目的。 站在修学净土的角度&#xff0c;他…

Ubuntu 20.04下多版本CUDA的安装与切换 超详细教程

目录 前言一、安装 CUDA1.找到所需版本对应命令2.下载 .run 文件3.安装 CUDA4.配置环境变量4.1 写入环境变量4.2 软连接 5.验证安装 二、安装 cudnn1.下载 cudnn2.解压文件3.替换文件4.验证安装 三、切换 CUDA 版本1.切换版本2.检查版本 前言 当我们复现代码时&#xff0c;总会…

如何监控和分析 PostgreSQL 中的查询执行计划?

文章目录 一、为什么监控和分析查询执行计划很重要二、PostgreSQL 中用于获取查询执行计划的方法三、理解查询执行计划的关键元素四、通过示例分析查询执行计划五、优化查询执行计划的常见策略六、使用工具辅助分析七、结合实际案例的详细分析八、总结 在 PostgreSQL 数据库中&…

STM32基础篇:引脚 × 复用 × 重映射

特殊引脚与普通引脚 特殊引脚 特殊功能引脚&#xff1a;"迫于生活压力"被特化的引脚&#xff0c;即为了满足芯片运行的基本条件。 以STM32F103C8T6型号为例&#xff0c;其特殊功能引脚&#xff08;11个&#xff09;(VddVss)*3多组供电接口VDDAVSSA(A表示Analog&…

Spring IOC基于XML和注解管理Bean

IoC 是 Inversion of Control 的简写&#xff0c;译为“ 控制反转 ”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出 松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Java 对象…

前端使用Threejs加载机械臂并控制机械臂跳舞

1. 前言 在我的第一篇博客中,大致讲解了如何使用threejs导入机械臂模型,以及如何让机械臂模型动起来的案例,可以看一下之前的博客前端使用Threejs控制机械臂模型运动 本篇博客主要讲解的是在原来的基础上添加GSAP动画库的应用,可以通过动画,来让机械臂进行指定轨迹位姿的运动…

Java 使用sql查询mongodb

在现代应用开发中&#xff0c;关系型数据库和NoSQL数据库各有千秋。MongoDB作为一种流行的NoSQL数据库&#xff0c;以其灵活的文档模型和强大的扩展能力&#xff0c;受到广泛欢迎。然而&#xff0c;有时开发者可能更熟悉SQL查询语法&#xff0c;或者需要在现有系统中复用SQL查询…

STM32——Modbus协议

一、Modbus协议简介&#xff1a; 1.modbus介绍&#xff1a; Modbus是一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气 Schneider Electric&#xff09;于1979年为使用可编程逻辑控制器&#xff08;PLC&#xff09;通信而发表。Modbus已经成为工业领域…

代码随想录训练第十一天|二叉树基础理论、二叉树递归遍历、二叉树迭代遍历、二叉树统一迭代法、LeetCode102.二叉树层序遍历

文章目录 二叉树理论基础二叉树种类满二叉树完全二叉树二叉搜索树平衡二叉搜索树 二叉树存储方式二叉树遍历方式二叉树的定义总结 二叉树的递归遍历思路前序遍历后序遍历中序遍历 二叉树的迭代遍历思路前序遍历&#xff08;迭代法&#xff09;中序遍历&#xff08;迭代法&#…

STM32-Unix时间戳和BKP备份寄存器以及RTC实时时钟

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. Unix时间戳1.1 Unix时间戳简介1.2 UTC/GMT1.3 时间戳转换 2. BKP备份寄存器2.1 BKP简介2.2 BKP基本结构2.3 BKP库函数 3. RTC实时时钟3.1 RTC简介3.2 RTC框图3.3 RTC基本结构3.4 硬件电路3.5 RTC操作注意事项3.6 R…

elementui中日期/时间的禁用处理,使用传值的方式

项目中,经常会用到 在一个学年或者一个学期或者某一个时间段需要做的某件事情,则我们需要在创建这个事件的时候,需要设置一定的时间周期,那这个时间周期就需要给一定的限制处理,避免用户的误操作,优化用户体验 如下:需求为,在选择学年后,学期的设置需要在学年中,且结束时间大…

C#反射基本应用

1、反射 反射是.NET Framework的一个特性&#xff0c;它允许在运行时获取类型的信息以及动态创建对象&#xff0c;调用方法&#xff0c;以及访问字段和属性。 2、代码 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy…