redis缓存
缓存雪崩
概述:
缓存同一时间大量失效导致请求直接访问数据库,数据库承受较高的访问压力导致挂掉,最终造成的故障就是缓存雪崩。
问题分析:
产生原因:同一时间大量的key失效。
可能因素:redis宕机、redis过期时间一致。
解决方案:
1、分散过期时间:设置不同的过期时间,让缓存失效时间分布均匀。
2、设置分级缓存:在一级缓存过期的基础上,访问二级缓存,设置过期时间不一致。
3、热点数据永不过期:
3.1:热点数据key值设置不过期。
3.2:异步线程加载快过期数据进行数据重新加载。
4、redis集群:通过设置集群避免redis宕机导致的问题。
5、互斥锁:当缓存失效后,通过互斥锁或者队列来控制读数据写缓存的数量。线程阻塞导致系统并发量降低。
6、熔断机制:通过限流,流量超过阀值,直接拦截处理。
7、redis持久化:重启恢复缓存数据。
缓存穿透
概述:
热点数据缓存失效导致数据请求打到mysql,大量并发情况下导致mysql挂掉,服务瘫痪。称为:缓存穿透
问题分析:
产生原因:热点数据失效
可能因素:缓存过期
解决方案:
1、互斥锁:通过互斥锁或者队列来控制读数据写缓存的线程数量。
2、热点数据不过期:
2.1:热点数据key值设置不过期。
2.2:异步线程加载快过期数据进行数据重新加载。
缓存击穿
概述:
无效key大量请求,导致缓存失效,直接访问服务库,大量并发访问导致系统故障。称为:缓存击穿
问题分析:
产生原因:无效key请求
可能因素:人为攻击(非法参数请求)
解决方案:
1、参数拦截请求:
2、设置无效key到缓存设置较短过期时间一分钟。
3、布隆过滤器:通过布隆过滤器判断key是否存在。存在误判。
缓存预热
概述:
为了避免系统上线,缓存没有加载,用户请求时直接访问数据库。人为的对用户可能请求的数据预加载,被称为缓存预热。
问题分析:
产生原因:没有缓存
可能因素:上线新功能
解决方案:
1、启动时加载:适合数据量不大的场景。
2、定时任务脚本:缓存加载和刷新。
3、热点数据优先:大数据场景。
缓存降级
概述:
服务降级:
访问剧增导致服务出现问题、非核心业务影响到核心业务。为了保证核心业务的可用性,直接返回默认数据或访问服务的内存数据。
缓存降级:
对与不重要的缓存数据使用降级策略。
问题分析:
1、服务剧增导致响应过慢或者无响应。
2、相关业务模块无响应导致核心业务阻塞。
解决方案:
1、将部分热点数据缓存到服务的内存中,出现缓存出现异常,可以直接使用服务的内存数据。
2、所谓的降级就是结合业务场景对可以降级的服务给出默认数据或者内存数据处理(内存事后具体更新)
服务降级:
eg:双十一的时候,我们买东西是不是都不允许修改购物地址,不允许发起退货,不允许退款还有很多服务都不可以用,只允许用户选择商品加入购物车付钱。那天只有一个目的就是让一些不是很重要的服务所占用的cpu资源都让出来,给购物,付款这样的核心服务。这样的话,用户付款的速度就会越来越快,毕竟前多少名支付的用户是有免单机会的。
服务降级主要用于当整个微服务架构整体的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务能正常运行,将一些不重要或不紧急的服务或任务进行服务的延迟使用或暂停使用。
降级是一种解决问题的方法或者策略。包含多种实现方式。降级目的就是为了解决资源不足和访问量增加的矛盾。
服务降级方式
1、延迟服务:定时任务处理、或者mq延时处理。比如新用户注册送多少优惠券可以提示用户优惠券会24小时到达用户账号中,我们可以选择再凌晨流量较小的时候,批量去执行送券。
2、页面降级:页面点击按钮全部置灰,或者页面调整成为一个静态页面显示“系统正在维护中,。。。。”。
3、关闭非核心服务:比如电商关闭推荐服务、关闭运费险、退货退款等。保证主流程的核心服务下单付款就好。
4、写降级:比如秒杀抢购,我们可以只进行Cache的更新返回,然后通过mq异步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。
5、读降级:比如多级缓存模式,如果后端服务有问题,可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景。