目录
redis缓存提供了高并发高性能,不仅可以用作缓存还可以做抽奖、粉丝列表收藏点赞、订单自动取消等功能。Redis提供了这些便利的同时也会引发一些问题,例如缓存与数据库双写不一致、缓存雪崩、缓存穿透、缓存击穿、缓存的并发竞争、缓存过期失效等问题。
缓存雪崩
服务系统在高峰期每秒5w个请求,缓存可以扛住每秒5w个请求,缓存机器意外发生故障全盘宕机。此时5w个请求全部落数据库,数据库扛不住然后就挂了。重启数据库,然后数据库立马又被新的流量给打死了,这就是缓存雪崩。缓存雪崩的事前事中事后的解决方案:事前:Redis高可用,主从+哨兵,Redis cluster,避免全盘崩溃。事中:本地ehcache缓存 + hystrix限流&降级,避免MySQL被打死。事后:Redis持久化,一旦重启自动从磁盘上加载数据,快速恢复缓存数据。
用户发送一个请求,系统A收到请求后,先查本地ehcache缓存,如果没查到再查Redis。如果 ehcache和Redis都没有再查数据库,将数据库中的结果写入ehcache和Redis中。限流组件,可以设置每秒的请求,有多少能通过组件,剩余的未通过的请求,怎么办?走降级!可以返回一些默认的值,或者友情提示或者空值。这样设计的好处在于,无论多高的并发数据库绝对不会挂掉,限流组件确保了每秒只有多少个请求能通过。只要数据库不死,对用户来说,2/5的请求都是可以被处理的。只要有2/5的请求可以被处理,就意味着系统可以用,对用户来说,可能就是点击几次刷不出来页面,但是多点几次,就可以刷出来了。
缓存穿透
对于系统A,假设一秒5000个请求,结果其中4000个请求是黑客发出的恶意攻击。黑客发出的那 4000个攻击缓存中查不到,每次去数据库里查也查不到。数据库id是从1开始的,结果黑客发过来的请求id全部都是负数。这样缓存中不会有,请求每次都“视缓存于无物”
本文介绍了Redis缓存可能导致的问题,包括缓存雪崩、缓存穿透和缓存击穿,并提出了相应的解决方案。缓存雪崩时,可采用Redis高可用、本地缓存及限流降级策略;缓存穿透可通过设置空值缓存和布隆过滤器减少无效查询;缓存击穿可考虑热点数据永不过期或使用分布式锁预先重建缓存。
订阅专栏 解锁全文
1万+

被折叠的 条评论
为什么被折叠?



