type
status
date
slug
summary
tags
category
icon
password
Sub-item
Last edited time
Oct 29, 2023 07:18 AM
Parent item
领域
缓存雪崩
假设有如下一个系统,高峰期请求为5000次/秒,4000次走了缓存,只有1000次落到了数据库上,数据库每秒1000的并发是一个正常的指标,完全可以正常工作,但如果缓存宕机了,每秒5000次的请求会全部落到数据库上,数据库立马就死掉了,因为数据库一秒最多抗2000个请求,如果DBA重启数据库,立马又会被新的请求打死了,这就是缓存雪崩。
如何解决缓存雪崩
- 事前:redis高可用,主从+哨兵,redis cluster,避免全盘崩溃
- 事中:本地ehcache缓存 + hystrix限流&降级,避免MySQL被打死
- 事后:redis持久化,快速恢复缓存数据
缓存穿透
假如客户端每秒发送5000个请求,其中4000个为黑客的恶意攻击,即在数据库中也查不到。举个例子,用户id为正数,黑客构造的用户id为负数,
如果黑客每秒一直发送这4000个请求,缓存不起作用,数据库也很快被打死。
如何解决缓存穿透
- 查询不到的数据也放到缓存,value为空,如set -999 “”,但是设置较短的过期时间。
- 使用bloom过滤器
总结
- 缓存雪崩就是缓存失效,请求全部全部打到数据库,数据库瞬间被打死。
- 缓存穿透就是查询了一个一定不存在的数据,并且从存储层查不到的数据没有写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义.