使用Redis实现缓存穿透的解决方案

使用Redis实现缓存穿透的解决方案

大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!

在缓存系统中,缓存穿透是指访问不存在的数据,导致请求直接穿透缓存层,直接访问数据库,造成数据库压力过大,甚至影响系统稳定性。本文将深入探讨如何使用Redis实现有效的缓存穿透解决方案。

1. 基本概念和问题背景

缓存穿透通常发生在恶意攻击或者大量请求查询不存在的数据时。例如,某些恶意用户不断查询不存在的用户信息,导致每次请求都要访问数据库,严重影响系统性能。为了解决这个问题,我们可以引入布隆过滤器和空值缓存等技术手段。

2. 使用布隆过滤器过滤无效请求

布隆过滤器是一种高效的数据结构,用于快速判断一个元素是否存在于集合中。在缓存层加入布隆过滤器,可以快速过滤掉不存在的请求,避免对数据库的直接查询。

package cn.juwatech.example;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
public class BloomFilterService {

    @Autowired
    private RedisService redisService;

    private BloomFilter<String> bloomFilter;

    @PostConstruct
    public void init() {
        int expectedInsertions = 1000000;
        double fpp = 0.01; // False Positive Probability
        bloomFilter = BloomFilter.create(Funnels.stringFunnel(), expectedInsertions, fpp);
    }

    public boolean mightContain(String key) {
        return bloomFilter.mightContain(key);
    }

    public void put(String key) {
        bloomFilter.put(key);
    }
}
3. 空值缓存策略

当查询的数据确实不存在时,不直接访问数据库,而是将空结果设置到缓存中,设置合理的过期时间,避免空值缓存过久占用内存资源。

package cn.juwatech.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class CacheService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void set(String key, Object value, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    }

    public void setNull(String key, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, "", timeout, unit); // Placeholder for null value
    }

    public boolean exists(String key) {
        return redisTemplate.hasKey(key);
    }
}
4. 实现缓存穿透解决方案

结合布隆过滤器和空值缓存策略,实现完整的缓存穿透解决方案。在查询前先通过布隆过滤器判断是否存在于缓存中,如果存在则直接返回缓存数据;如果不存在,则进行数据库查询,查询结果为空时设置空值缓存,并设置较短的过期时间,避免重复查询。

package cn.juwatech.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class DataService {

    @Autowired
    private CacheService cacheService;

    @Autowired
    private DatabaseService databaseService;

    @Autowired
    private BloomFilterService bloomFilterService;

    public Object getData(String key) {
        if (bloomFilterService.mightContain(key)) {
            if (cacheService.exists(key)) {
                return cacheService.get(key);
            } else {
                Object data = databaseService.getData(key);
                if (data != null) {
                    cacheService.set(key, data, 10, TimeUnit.MINUTES); // Example: cache for 10 minutes
                    return data;
                } else {
                    cacheService.setNull(key, 1, TimeUnit.MINUTES); // Example: cache null value for 1 minute
                    return null;
                }
            }
        } else {
            return null; // Request not in bloom filter, likely invalid
        }
    }
}

通过以上实现,我们能够有效地解决缓存穿透问题,提升系统的性能和稳定性,确保对数据库的请求能够得到有效地缓存和利用。

微赚淘客系统3.0小编出品,必属精品,转载请注明出处!

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

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

相关文章

YoloV9改进策略:Block改进|轻量实时的重参数结构|最新改进|即插即用(全网首发)

摘要 本文使用重参数的Block替换YoloV9中的RepNBottleneck&#xff0c;GFLOPs从239降到了227&#xff1b;同时&#xff0c;map50从0.989涨到了0.99&#xff08;重参数后的结果&#xff09;。 改进方法简单&#xff0c;只做简单的替换就行&#xff0c;即插即用&#xff0c;非常…

保健品商城小程序模板源码

保健品商城小程序模板源码 简洁通用的保健品&#xff0c;健康生活&#xff0c;零售商品&#xff0c;电子商务微信小程序前端模板下载。包含&#xff1a;主页、购物车、客服、个人中心、我的订单、商品详情、我的钱包、设置等等。 保健品商城小程序模板源码

程序员如何做好需求判断?

1. 导语 本文作为2024上半年核心思考之二。 通过他人经验传导、个人实践、广泛阅读书籍(方法论类、企业经营类、传记类、财务类&#xff0c;具体书单附文末)&#xff0c;学会基于更高阶的经营者视角来做好业务需求判断。本文思路如下&#xff1a; 首先&#xff0c;抛一个灵魂问…

【server】springboot 整合 redis

1、redis 使用模式 1.1 单机模式 1.1.1 编译安装方式 1.1.1.1 下载 Redis的安装非常简单&#xff0c;到Redis的官网&#xff08;Downloads - Redis&#xff09;&#xff0c;下载对应的版本&#xff0c;简单几个命令安装即可。 1.1.1.2 编译安装 tar xzf redis-stable.tar.…

IDEA 开发工具

IDEA 开发工具 IDEA软件激活新建项目新建project 运行调试 IDEA软件激活 访问激活码网进入带*的域名下载并解压左上角的zip包先执行sh uninstall.sh&#xff0c;再执行sh install.sh在带*的网页中复制并使用激活码code 新建项目 新建project file》New〉Project》New Proje…

【测试】系统压力测试报告模板(Word原件)

系统压力测试&#xff0c;简而言之&#xff0c;是在模拟高负载、高并发的环境下&#xff0c;对系统进行全面测试的过程。它旨在评估系统在面对极端使用条件时的性能表现&#xff0c;包括处理能力、响应时间、资源消耗及稳定性等关键指标。通过压力测试&#xff0c;开发团队能够…

MySQL之备份与恢复和MySQL用户工具(一)

备份与恢复 备份脚本化 为备份写一些脚本是标准做法。展示一个示例程序&#xff0c;其中必定有很多辅助内容&#xff0c;这只会增加篇幅&#xff0c;在这里我们更愿意列举一些典型的备份脚本功能&#xff0c;展示一些Perl脚本的代码片段。你可以把这些当作可重用的代码块&…

Python酷库之旅-第三方库Pandas(009)

目录 一、用法精讲 19、pandas.read_xml函数 19-1、语法 19-2、参数 19-3、功能 19-4、返回值 19-5、说明 19-6、用法 19-6-1、数据准备 19-6-2、代码示例 19-6-3、结果输出 20、pandas.DataFrame.to_xml函数 20-1、语法 20-2、参数 20-3、功能 20-4、返回值 …

【国产开源可视化引擎Meta2d.js】网格

画布背景网格 在线体验&#xff1a; 乐吾乐2D可视化 示例&#xff1a; // 设置默认缺省网格属性 meta2d.store.options.grid true; // 开启 meta2d.store.options.gridColor eeeeee; // 网格线条颜色 meta2d.store.options.gridSize 10; // 格子大小// 设置单个图纸的网格…

Golang | Leetcode Golang题解之第222题完全二叉树的节点个数

题目&#xff1a; 题解&#xff1a; func countNodes(root *TreeNode) int {if root nil {return 0}level : 0for node : root; node.Left ! nil; node node.Left {level}return sort.Search(1<<(level1), func(k int) bool {if k < 1<<level {return false}…

【ETABS】【RHINO】案例:Swallow to ETABS

文章目录 01. Swallow Overview总览1 LOAD&#xff1a;Defination of LoadCase、Response Combo2 SectionArea Section and Area Load&#xff08;面截面定义与指定&#xff0c;面荷载指定&#xff09;Frame Section with rebarattr and linear load&#xff08;带钢筋属性框架…

flutter:监听路由的变化

问题 当从路由B页面返回路由A页面后&#xff0c;A页面需要进行数据刷新。因此需要监听路由变化 解决 使用RouteObserver进行录音监听 创建全局变量&#xff0c;不在任何类中 final RouteObserver<PageRoute> routeObserver RouteObserver<PageRoute>();在mai…

Hi3861 OpenHarmony嵌入式应用入门--UDP Server

本篇使用的是lwip编写udp服务端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点&#xff0c;并且密码为PARAM_HOTSPOT_PSK。 修改网络参数 在Hi3861开发板上运行上述四个测试程序之前&#xff0c;需要根据你的无线路由、Linux系统IP修改 net_params.h文件的相关代码&…

基于轨迹信息的图像近距离可行驶区域方案验证

一 图像可行驶区域方案 1.1 标定场景 1.2 标定步骤 设计一定间距标定场&#xff0c;在标定场固定位置设置摄像头标定标识点。主车开到标定场固定位置录制主车在该位置各个摄像头数据&#xff0c;通过摄像头捕获图像获取图像上关键点坐标pts-2d基于标定场设计&#xff0c;计算…

Python | Leetcode Python题解之第222题完全二叉树的节点个数

题目&#xff1a; 题解&#xff1a; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def countNodes(self,…

基于字典学习的地震数据降噪(MATLAB R2021B)

稀疏表示基于研究者们提出了许多变换基函数的方法逐渐成型&#xff0c;比如小波域&#xff0c;曲波域&#xff0c;dreamlet 域等&#xff0c;其原理是利用地震信号在变换域内的稀疏性和可分离性以去除噪声。继 Donoho发表非线性去噪方法-小波阈值萎缩方法&#xff0c;在后续的研…

汉中茗茶小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;茶叶管理&#xff0c;论坛管理&#xff0c;公告管理&#xff0c;茗茶历史管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;茗茶信息&#xf…

阶段三:项目开发---搭建项目前后端系统基础架构:任务9:导入空管基础数据

任务描述 本阶段任务是导入项目的基础数据&#xff0c;包括空管基础数据和离线的实时飞行数据&#xff08;已经脱敏&#xff09;。 任务指导 本阶段任务需要导入两种数据&#xff1a; 1、在MySQL中导入空管基础数据 kongguan.sql空管基础数据表说明&#xff1a; 1告警信息…

JVM原理(二二):JVM虚拟机线程调度与状态转换

1. Java线程调度 Java的线程是被映射到系统的原生线程上实现的 线程调度是指系统为线程分配处理器使用权的过程&#xff0c;调度主要方式有两种&#xff0c;分别是协同式线程调度和抢占式线程调度。 协同式线程调度&#xff1a;如果使用协同式调度的多线程系统&#xff0c;线…

Cortex-A510——内核及汇编

Cortex-A510——内核及汇编 小狼http://blog.csdn.net/xiaolangyangyang 1、异常等级 2、异常等级切换 同步异常&#xff1a; 1、SVC/HVC/SMC&#xff1b; 2、MMU引发的异常&#xff08;内核态EL1发生&#xff0c;发生后不会进行异常等级切换…