缓存雪崩|击穿|穿透
# 1 缓存雪崩
# 1.1 什么是缓存雪崩?
缓存同一时间大面积失效,后面请求全部落到数据库,造成数据库短时间内承受大量请求而崩掉。
# 1.2 缓存雪崩有什么解决方案?
步骤 | 解决方案 |
---|---|
事前 | 1)尽量保证整个redis集群高可用,发现机器宕机尽快补上。 |
2)缓存失效时间可以在原来的基础上加多一个随机值,避免同一时间集体失效。 | |
事中 | 开启限流或者降级,避免Mysql崩掉。 |
事后 | 利用redis持久化机制保存的数据尽快恢复缓存。 |
# 2 缓存击穿
# 2.1 什么是缓存击穿?
Key对应的数据存在,但是在redis未缓存或者已经过期,此时大量请求过来,由于redis中不存在,需要去数据库查询之后再回写redis缓存,造成大量请求直接打在数据库上,很容易把数据库压垮。
# 2.2 缓存击穿有什么解决方案?
1)定时任务主动刷新缓存。
2)通过加锁的方式解决,用普通jvm的锁就可以。
查缓存时能命中则直接返回,不能命中则需要获取锁才能进行下一步访问数据库等操作。
![](http://media.luoxiaofeng.cn/blog/img/eca8ee22dcef8bab5693996a9fb1d808.png)
# 3 缓存穿透
# 3.1 什么是缓存穿透?
Key对应的数据不存在,一般是黑客故意去请求缓存中不存在的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
# 3.2 缓存穿透有什么解决方案?
1)最简单粗暴的办法,如果一个查询返回的数据为空(不管数据不存在,还是系统故障),仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
2)采用布隆过滤器,将有值的key存放到布隆过滤器中,则没有值的key必然会被过滤掉。
上次更新: 2022/06/12, 13:37:23