redis缓存穿透

article/2025/9/22 14:48:58

ps:想只读有效信息,见红字

正常情况

当在高并发,高性能,降低数据库压力的情况下,首先会选择redis作为缓存机制,当有大量请求需要查询数据库时,为了降低数据库的压力,并提高请求查询性能(redis基于内存,读取速度快),会将数据库的信息缓存到redis中,这样就形成了很好的分层结构,请求可以直接查询redis中缓存的信息,然后返回,就不需要经过数据库,减小了数据库的压力,同时,可以迅速查询到信息,岂不美哉。
先从缓存取数据,娶不到从数据库取,取到了就返回并添加缓存或更新缓存,取不到就返回空。

正常请求操作
common

第4步,当从数据库拿到数据时,一并添加到redis缓存,下次若是相同请求,直接访问redis并返回,大大提升了性能和可用性,持久性。

非正常情况

但有利就有弊,如果请求的数据是数据库中没有的,同样redis中也不会出现此数据缓存,这样当某短时间大量无效请求(数据库无对应数据)访问时,由于redis中没有此数据缓存,请求就给到了数据库,那么压力就来到了数据库这边,可想而知,其中会浪费掉多少性能,若是有心怀**之人故意为之,后果可想而知。所以,这就需要一个很好的解决方案,当大量无效请求(数据库并没有此数据)来访问时,就会导致缓存穿透。
缓存和数据库都娶不到数据,若大量无效请求发起,数据库负载压力过大

非正常操作(在大量无益请求的场景下)
unnormal

第4步变为直接返回null,那么请求一多,全都访问数据库,好嘛,要是网站被攻击了,那数据库就白想活着~

解决方案✍️✍️

1.redis缓存设空(“”)

redis设置key-null,TTL设置短时间
那么就又要考虑了,当一个请求访问时,我们两层都没有相应数据,数据库操作后接着对redis设一个空的键值,那么当我过了段时间又增加了一条数据,正好就是这个请求需要的,当第一步走到redis时直接就死掉了,那么可太不划算了。
所以在缓存设空时尽量TTL一个短时间,防住短时间大量请求即可,谁也不会闲的干这事。
redis=null
那么我们接下来模拟一下具体场景
下面是操作流程代码块

    @Overridepublic Result queryById(Long id) {//从redis查询商铺缓存String key = "cache:shop"+id;//根据key拿到数据json块String shopJson = stringRedisTemplate.opsForValue().get(key);if (StrUtil.isNotBlank(shopJson)) {//存在,转化为对应实体类直接返回Shop shop = JSONUtil.toBean(shopJson, Shop.class);return Result.ok(shop);}//判断命中的是否为空值,下下面代码存入的value为""空if (shopJson!=null) {//等效于shopJson==""//返回一个错误信息return Result.fail("店铺不存在");}//不存在根据id查数据库Shop shop = getById(id);if (shop == null) {//数据库中不存在,将null写入redis,并设置TTLstringRedisTemplate.opsForValue().set(key,"",2, TimeUnit.MINUTES);return Result.fail("店铺不存在");}//存在,存入redisstringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),60, TimeUnit.MINUTES);return Result.ok(shop);}

一条请求,这里是根据id来查询,此时设置id为0,数据库并不存在这条数据。观察到,返回了不存在json信息在这里插入图片描述
而且redis是没有缓存的,所以执行了相应数据库的sql操作,数据库并没有id为0的数据,所以下一步就是增加redis空缓存
123此时,redis增加了一个key表示店铺id为0的空缓存,右上角TTL还剩·114秒(设置的为2分钟)在这里插入图片描述
这样就能在短时间在缓存层面拦截大量无意义请求。

2.布隆过滤

利用hash算法计算数据库数据得到byte数组,当请求来访问先经过布隆过滤器,根据此数组0和1判断数据是否存在,存在就放行到redis否则拒绝。


http://chatgpt.dhexx.cn/article/1q3FhAKR.shtml

相关文章

linux下清理redis缓存

输入命令,连接到redis 服务端 redis-cli -h 127.0.0.1 -p 6379#不用切换到redis的bin下面, 是因为安装redis 时已经配置了系统变量验证登录密码, auth 你的redis密码 开始清理缓存,清理命令如下 指定redis片区: selec…

redis缓存命中率

登录redis服务器 输入 redis-cli 链接到redis之后,输入info 则会打印 通过计算hits和miss,我们可以得到缓存的命中率:111207/ (111207 50181) 68.9% ,一个缓存失效机制,和过期时间设计良好的系统,命中率…

命令行清除Redis缓存

一、打开命令行窗口 打开Redis安装目录下的《 redis-li.exe 》。 二、授权 在打开的命令行里直接操作会提示没有权限,需要先使用auth命令授权,使用方法如下。 auth ‘这里是Redis密码’ 三、清除缓存 清除缓存有两种方式:清除数据库缓存、清…

Redis缓存预热

概述 在秒杀开始前通常要进行将数据加载到缓存中,也叫缓存预热 demo Redis序列化配置,通常有两种方式,通过配置类进行序列化配置, Configuration public class RedisConfig {Autowiredprivate RedisConnectionFactory factory…

redis缓存失效问题

什么是缓存穿透?什么是缓存击穿?什么是缓存雪崩? 一个正常的访问流程: 1.缓存雪崩:redis缓存key同一时间大量失效,导致大量请求全部打到数据库,造成数据库挂掉。 如图: 缓存雪崩…

Redis缓存雪崩及解决办法

缓存雪崩 1.缓存雪崩是指在同- -时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到 达数据库,带来巨大压力。 2.解决方案: ◆给不同的Key的TTL添加随机值 ◆利用Redis集群提高服务的可用性 ◆给缓存业务添加降级限流策略 降级可做为系统的保底…

Redis缓存注解

本篇博客将详细讲解Cacheable,CachePut , CacheEvict使用,希望对大家有所帮助。 1、Cacheable 作用是主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 参数解释examplevalue缓存的名称,在 spring 配置文件中定义,必…

Redis缓存的工作机制

Redis:缓存的工作机制 Redis缓存的工作机制缓存的特征Redis缓存处理请求Redis作为旁路缓存Redis中缓存的类型只读缓存读写缓存 参考文献 Redis缓存的工作机制 Redis具有高性能的数据存取特性,广泛的应用于缓存场景,在提升业务应用响应速度的同时&#xf…

Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案

前言 在日常的项目中,缓存的使用场景是比较多的。缓存是分布式系统中的重要组件,主要解决在高并发、大数据场景下,热点数据访问的性能问题,提高性能的数据快速访问。本文以Redis作为缓存时,针对常见的缓存击穿、缓存穿…

Redis缓存应用场景解析

Redis的应用场景非常广泛。虽然Redis是一个key-value的内存数据库,但在实际场景中,Redis经常被作为缓存来使用,如面对数据高并发的读写、海量数据的读写等。 举个例子,A网站首页一天有100万人访问,其中有一个“积分商…

Redis缓存三大问题

缓存三大问题 ​ 我们都知道,Redis的Key都存在一个ttl(time to live)过期时间,Redis默认的是永不过期。Redis作为缓存,一方面可以提升速度,但也会带来三大常见的缓存问题:缓存穿透、缓存击穿和缓存雪崩。 ​ Redis作…

Redis缓存

Redis 一、Redis简介 一般为了提升性能,会在存储层和客户端之间添加一个缓存层,当客户端向后端发送请求的时候,会先去缓存层查,看看是否有相应的数据,如果有则直接返回,这样就减轻存储层的压力&#xff0c…

【Redis缓存】

一、使用Redis缓存的优点 相比于数据库而言,缓存的操作性能更高,缓存性能高的主要原因有以下几点: 1、缓存一般都是key-value查询数据的,因为不像数据库一样还有查询的条件等因素,所以查询的性能一般会比数据库高&am…

Redis缓存机制(详解)

1.Redis 是什么? *redis是*一个运行在内存上的key-value存储系统。是NoSQL数据库之一 2.缓存穿透,缓存击穿,缓存雪崩 /**缓存穿透*/ 它会先查询Redis,Redis没有会查询数据库,数据库也没有这就是缓存穿透 业界主流解决方案:布隆过滤器布隆过滤器的使用步骤 布隆过滤器的使用步…

如何使用 Redis 缓存?

​ 编辑 添加图片注释,不超过 140 字(可选) 如何使用 Redis 缓存 前言 对于 Redis 来讲,作为缓存使用,是我们在业务中经常使用的,这里总结下,Redis 作为缓存在业务中的使用。 旁路缓存 Cach…

Redis实战——缓存

目录 1 前言 1.1什么是缓存? 1.2 缓存的作用及成本 1.3 Redis缓存模型 2 给商户信息添加缓存 3 缓存更新策略 3.1 更新策略介绍 3.2 主动更新策略 3.3 主动更新策略练习 4 缓存穿透及其解决方案 4.1 缓存穿透的概念 4.2 解决方案及实现 5 缓存雪崩的…

SpringBoot整合Redis缓存

SpringBoot整合Redis缓存 一、缓存概念知识1、是什么缓存2、缓存的优缺点3、为什么使用缓存 二、Redis概念知识1、Redis简介2、为什么用Redis作为缓存3、Redis 支持的数据类型4、Redis缓存常见问题1. 缓存穿透2. 缓存击穿3. 缓存雪崩4. 缓存一致性 三、SpringBoot整合redis1、使…

云平台的层次架构

云计算平台 ​ 云计算是一种资源的服务模式,该模式可以实现随时随地、便捷按需地从可配置计算资源共享池中获取所需的资源(如网络、服务器、存储、应用及服务),资源能够快速供应并释放,大大减少了资源管理工作开销。 ​ 经典云计算架构包括…

政务云平台服务

做政企项目交付,部署在政务云上的信息系统,经常会需要申请政务云资源,尤其是等保测评,还需要申请相关安全服务设施。 通过几个参考例子,简要说明政务云平台的自愿服务。 广州市信息化服务中心 广州市政府信息化云服…

SaaS的几种架构解析

转载:https://www.xugj520.cn/amp/SaaS_Architecture.html SAAS成熟度模型分级 LEVEL1 定制开发 软硬件都由SAAS服务商提供,软件的使用者只需要按时间、用户数、空间等逐步支付租赁使用费用即可 LEVEL2 可配置 通过不同的配置满足不同用户的需求&#…