redis 缓存穿透 缓存击穿 缓存雪崩

redis 缓存穿透 缓存击穿 缓存雪崩

1.缓存穿透

前提:应用服务器压力过大 > 导致redis命中率过低(查询不到缓存)> 一直查询数据库

描述:1.redis查询不到数据 2.出现很多非正常url访问(一般出现这些问题都是恶意攻击网站造成)

解决方案:

  • 方案1: 对于数据库中不存在的数据, 也对其在缓存中设置默认值Null,为避免占用资源,一般过期时间会比较短;

  • 方案2: 可以设置一些过滤规则, 如布隆过滤器

(目前主流的一种的载体就是布隆过滤器. 布隆过滤器是一种概率型数据结构,特点是高效地插入和查询,可以用来告诉你 "某样东西一定不存在或者可能存在".

相比于传统的 List、Set、Map 等数据结构,布隆过滤器是一个bit数组, 它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。)

  • 方案3:进行实时监控(对一直恶意访问的人设置黑名单)

2.缓存击穿

前提:

  • 1.数据库访问压力瞬时增加

  • 2.redis里面没有出现大量key过期

  • 3.redis正常运行

描述:某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。

解决方案:

  • 方案1:预先设置热门数据:在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的时长

  • 方案2:实时调整:现场监控那些数据热门,实时调整key的过期时长

  • 方案3:使用锁:并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,直接走缓存。

3.缓存雪崩

前提:数据库压力变大服务器崩溃

描述:大量的热点 key 设置了相同的过期时间,导在缓存在同一时刻全部失效,造成瞬时数据库请求量大、压力骤增,引起雪崩,甚至导致数据库被打挂。

解决方案:

1、过期时间打散。既然是大量缓存集中失效,那最容易想到就是让他们不集中生效。可以给缓存的过期时间时加上一个随机值时间,使得每个 key 的过期时间分布开来,不会集中在同一时刻失效。

2、设置过期标志更新缓存。记录缓存数据是否过期(设置提前量)。如果过期会触发通知另外的线程在后台去更新实际key的缓存

3、加互斥锁。该方式和缓存击穿一样,按 key 维度加锁,对于同一个 key,只允许一个线程去计算,其他线程原地阻塞等待第一个线程的计算结果,然后直接走缓存即可。

4、构建多级缓存架构。nginx缓存 + redis缓存 + 其它缓存(ehcache等)

5、限流降级

6、缓存预热:在实际开发中,我们可以利用大数据统计用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。

相关推荐
岁月变迁呀3 小时前
Redis梳理
数据库·redis·缓存
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
Code apprenticeship5 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站5 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶5 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
fpcc7 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
Ewen Seong7 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存
安全二次方security²7 小时前
SMMU软件指南SMMU编程之虚拟机结构和缓存
缓存·cache·smmu·arm安全架构·系统mmu·虚拟机结构·vms
黄名富9 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
G_whang10 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器