Redis 缓存穿透、缓存雪崩的概念及其预防

缓存穿透

【什么是缓存穿透】

频繁查询不在缓存中的数据,给原本被缓存保护的系统过大压力。

【为什么会发生缓存穿透】

1. 程序没写好;

2. 恶意攻击。

【怎样防止缓存穿透】

1. 在对 key 进行查询之前,先做初步判断,如果 key 一定不存在(例如,对某表的缓存,key 一定由数字组成,那么包含非数字的key一定是不存在的),则不查缓存或数据库,直接给结果;

2. 对于攻击 key 范围小的情形,未命中缓存,且未在数据库中查询到的情形,也放入缓存,用一个特殊的 value 表示此 key 不存在。

缓存雪崩

【什么是缓存雪崩】

一大批 key 几乎同时失效,给原本被缓存保护的系统过大压力。

【怎样预防缓存雪崩】

1. 缓存失效后,通过加锁或任务队列来限制读取后端系统的并发数;

2. 给过期时间增加随机值:过期时间由原来的 T 改为 T+R,其中 R 为一个合理范围内的随机数,使得缓存不会大批量同时失效;

3. 做二级缓存,A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2,A1 缓存失效时间设置短一些,A2 设置长一些。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

缓存三大问题及解决方案

1.缓存来由随着互联网系统发展的逐步完善,提高系统的qps,目前的绝大部分系统都增加了缓存机制从而避免请求过多的直接与数据库操作从而造成系统瓶颈,极大的提升了用户体验和系统稳定性。2.缓存问题虽然使用缓存给系统带来了一定的质的提升,但同时也带来了一些需要注意的问题。2.1缓存穿透缓存穿透是指查询一个一定不存在的数据,因为缓存中也无该数据的信息,则会

Redis 击穿、穿透、雪崩的解决方案

Redis击穿、穿透、雪崩的解决方案击穿和穿透场景:指的是单个key在缓存中查不到,去数据库查询(透过redis去查db叫击穿)区别:击穿:数据在数据库中真实存在,缓存丢失,大量请求击穿数据库穿透:数据在缓存中没有,数据库中也没有

Redis 总结精讲

本文围绕以下几点进行阐述1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题