02_架构中引入缓存带来的问题
2020-02-20 22:09:31 19 举报
架构中引入缓存带来的问题
作者其他创作
大纲/内容
系统
1、缓存因某种原因宕机了,缓存失效,所有5000请求全部涌入数据库,直接把数据库打死了。此时如果没有特别的方案,来处理这个事故,dba很着急,dba重启数据库立马会被新的流量打死。
说明:加入系统缓存流程1、用户发送一个请求,2、系统收到请求,先查本地ehcache缓存,再查redis缓存,3、如果ehcache和redis都没有就查数据库4、将查到的值写入ehcache和redis
说明:高峰期缓存每秒抗4000个请求
用户
缓存雪崩现象
黑客发出的4000个请求到数据库肯定是查不到的。数据库id从1开始,黑客请求id是负数-1 -99 -100解决:每次系统A只要到数据库没有查到,就写一个空值到缓存中,如:set -99 UNKOWN
解决方案1:该key设置为永不过期。
1、每秒5000个请求,有4000个请求是黑客发出的恶意攻击。
缓存
3、此时该key过期。
2、1000个正常用户请求到缓存
3、事后redis持久化机制,尽快恢复缓存集群,一旦重启,自动从磁盘加载数据,恢复内存中的数据。
ehcahe
3、4000个请求到数据库,直拉把数据库打死
解决缓存雪崩问题
加入限流组件的好处好处1:数据库绝对不会死,因为限流组件,每次只放2000个请求过来。好处2:只要数据不死,对用户来说,2/5的请求都是可以被处理成功的。好处3:只有2/5的请求被处理,对用户来说就可能是刷5次还是有1次可以刷出来的
2、事中本地cache + 限流组件
1、事前保证redis集群高可用
4、5000个直接涌入数据库,直接就把数据库打死了。
2、5000请求从缓存中取key的值
对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
说明:高峰期数据库每秒抗1000个请求
数据库
系统添加限流组件,请求到数据库之前进行限制限流组件,可以设置每秒限制2000个请求,一秒过来5000个请求,只有2000个请求进入数据库。剩余的3000个请求走降级,限流组件会发现有3000个请求没法通过自己,会调用你自己开发好的一个降级组件,返回一些默认的值,如友好提示或者空白值。
缓存击穿问题
说明:缓存雪崩是解决不了的,只能去缓解。
系统A
说明:高峰期每秒请求5000次
缓存穿透问题
Hystrix
1、5000个请求一直请求同一个key的值
0 条评论
下一页