使用Redisson的布隆过滤器解决缓存穿透问题

server/2024/10/25 11:00:03/

使用Redisson实现缓存穿透的布隆过滤器示例

以下是一个使用Redisson库的RBloomFilter来解决缓存穿透问题的Java代码示例。在这个示例中,我们会通过布隆过滤器预先过滤无效的请求,以减少对数据库的压力。

代码示例

首先,确保在项目中引入Redisson依赖(在pom.xml中):

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.16.0</version> <!-- 确保使用最新版本 -->
</dependency>

接下来,编写代码:

java">import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.Redisson;
import org.redisson.config.Config;import java.util.concurrent.ConcurrentHashMap;public class BloomFilterExample {private static RedissonClient redisson;private static RBloomFilter<String> bloomFilter;// 模拟数据库private static ConcurrentHashMap<String, String> database = new ConcurrentHashMap<>();static {// 初始化RedissonConfig config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");redisson = Redisson.create(config);// 创建布隆过滤器bloomFilter = redisson.getBloomFilter("myBloomFilter");bloomFilter.tryInit(1000000, 0.03); // 初始化布隆过滤器:预计插入100万条数据,误判率0.03%// 模拟数据库数据database.put("user:1", "John");database.put("user:2", "Jane");// 将存在的用户ID加入布隆过滤器bloomFilter.add("user:1");bloomFilter.add("user:2");}public static void main(String[] args) {System.out.println(getUserData("user:1")); // 从数据库获取System.out.println(getUserData("user:3")); // 触发布隆过滤器}public static String getUserData(String userId) {// 检查布隆过滤器if (!bloomFilter.contains(userId)) {return "Invalid Request (User does not exist)";}// 模拟数据库查询String userData = database.get(userId);if (userData != null) {return "User Data: " + userData;} else {return "User Data Not Found";}}
}
代码说明
  1. RedissonClient 初始化

    • 使用Redisson.create(config)创建Redisson客户端,连接到Redis服务器。
  2. RBloomFilter 创建与初始化

    • 使用redisson.getBloomFilter("myBloomFilter")获取布隆过滤器实例,并通过tryInit方法初始化。这里设置预计插入100万条数据和误判率为3%。
  3. 数据库模拟

    • 使用ConcurrentHashMap模拟数据库,并添加一些用户数据。
  4. 布隆过滤器使用

    • getUserData方法中,首先检查布隆过滤器。如果用户ID不在过滤器中,则直接返回无效请求。
    • 如果ID存在,则从模拟的数据库中查询相应的数据。
运行结果示例
User Data: John
Invalid Request (User does not exist)
总结

通过使用Redisson的RBloomFilter,我们有效地避免了无效请求对数据库的冲击。这种方法非常适合于高并发场景下的缓存穿透问题,确保了系统的稳定性和性能。


http://www.ppmy.cn/server/134697.html

相关文章

vscode使用make编译c的问题

问题1&#xff1a;makefile:2: *** missing separator. Stop vscode的配置问题&#xff0c;看这哥们的文章即可&#xff1a;https://blog.csdn.net/m0_57464986/article/details/134220676 问题2&#xff1a;创建makefile文件 直接创建文件名为“makefile”的文件即可&#x…

Linux 命令—— ping、telnet、curl、wget(网络连接相关命令)

文章目录 网络连接相关命令pingtelnetcurlwget 网络连接相关命令 ping ping 命令是用于测试网络连接和诊断网络问题的工具。它通过向目标主机发送 ICMP&#xff08;Internet Control Message Protocol&#xff09;回显请求&#xff0c;并等待回复&#xff0c;以确定目标主机是…

【1024特辑 | 机器学习-无监督学习】EM算法

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

【C#】.NET Framework 和 .NET的联系与区别

.NET Framework 和 .NET&#xff08;通常指 .NET Core 或 .NET 5/6/7&#xff09; 是微软推出的两种不同的开发平台&#xff0c;它们虽然都基于 .NET 技术&#xff0c;但有一些关键区别。让我们逐一分析它们的不同点&#xff0c;以帮助你在选择开发环境时做出合适的决定。 1. …

C#PropertyGrid下拉选择数据报错

1、问题点--PropertyGrid下拉框报错 PropertyGrid&#xff1a;属性窗口&#xff1a;滚轮选择或者手动输入不报错&#xff0c;下拉框选择报错 属性值无效&#xff1a;类型“System:String”的对象无法转化为类型“System:Int32” PropertyGrid&#xff1a;属性窗口&#xff1a;…

Prisma ORM 第三章 新增 更新 删除

1. 新增数据 在 Prisma 中&#xff0c;新增数据是一个常见的操作&#xff0c;可以通过 create 和 createMany 方法来实现。这两个方法分别用于创建单个记录和多个记录。下面详细介绍这两个方法及其配置项。 1. create 方法 create 方法用于在数据库中创建单个记录。你可以指…

基于Ubuntu24.04,下载并编译Android12系统源码 (一)

1. 前言 1.1 编译源码可以干什么 定制Android系统将最新版本的Android系统刷入到自己的Android设备中将整个系统源码导入到Android Studio中&#xff08;可以不用编译源码来实现&#xff09;。 只要有对应的Android源码版本的android.iml和android.ipr文件&#xff0c;就可以…

python基础综合案例(数据可视化-地图可视化)

1.基础地图使用 注意写名字的时候要写全名&#xff0c;比如上海市不能写出上海&#xff0c;不然看不到数据 鼠标点击即可看到数据 设置属性的时候不要忘记导包 # 演示地图可视化的基础使用 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts # 准…