1.缓存穿透
现象:查询数据库和缓存都没有的数据
解决方式:①缓存空对象 代码简单,效果不好
②布隆过滤器 代码负载,效果好,布隆过滤器可以使用redis的bitmap实现
2.缓存击穿
现象:数据库有数据,缓存中没有(这条数据没人访问过),或者数据刚好失效,热点数据的访问
解决方式,加redis分布式锁,只允许一个线程去读数据库,然后将读到的数据缓存到redis
3.缓存雪崩
现象:redis挂了,或者大部分数据失效
规避雪崩:redis搭建高可用集群(cluster),错开数据过期时间
出现雪崩:降级,熔断,限流,大部分数据失效的可以使用redis分布式锁
降级->是指在某些高并发场景下,把某些非核心的业务统统往下调。
熔断->熔断机制是应对雪崩效应的一种微服务链路保护机制。在微服务中,扇出的微服务不可用或者相应时间过长的话会对服务降级,进而熔断该服务节点,快速返回错误信息,释放资源。而当检测到微服务响应正常后,则恢复调用。
熔断设计
在熔断的设计主要参考了hystrix的做法。其中最重要的是三个模块:熔断请求判断算法、熔断恢复机制、熔断报警
(1)熔断请求判断机制算法:使用无锁循环队列计数,每个熔断器默认维护10个bucket,每1秒一个bucket,每个blucket记录请求的成功、失败、超时、拒绝的状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。
(2)熔断恢复:对于被熔断的请求,每隔5s允许部分请求通过,若请求都是健康的(RT<250ms)则对请求健康恢复。
(3)熔断报警:对于熔断的请求打日志,异常请求超过某些设定则报警。
限流->限流指的是降低一定时间内的并发访问量 一般两种做法 一种是拉长时间,一种是降低访问QPS
限流算法一般分为以下几种:滑动窗口,漏桶,令牌桶.