缓存雪崩

概念

原有缓存失效,新缓存未到来期间,原本都请求缓存的,现在都去访问数据库了。短时间内对
数据库、CPU、内存造成巨大压力,严重时可导致数据库宕机,从而引起一系列连锁反应,导致系统崩溃。

解决方案

1.并发量要求不大的时候,可以加锁队列,控制最大访问数。
2.给缓存加上标识,如果过期,则进行缓存更新。提高缓存命中率,降低数据库访问。
3.为每个key设置失效时间。

缓存穿透

概念

在数据库中查询结果没有,返回空,那么缓存中必然也没有,两次无用查询。

解决方案

1.采用布隆过滤器,将可能的值hash到一个足够大的bitmap里,通过bitmap可以过滤掉一个肯定不存在的值,从而减少对缓存和数据库无用的访问。
2.采用暴力缓存方式,不管查询数据库结果是不是为空,都进行缓存。但这个缓存有效时间设置比较短,一般不超过5分钟,当下次进行更新后就可以取到值。

缓存预热

概念

系统刚上线,很多缓存其实都还没有,那么需要对缓存进行初始化,减少对数据库的访问。

缓存更新

缓存更新除了缓存服务器自带的缓存失效策略之外(Redis 默认的有 6 中策略可供选择:volatile-lru、volatile-ttl、volatile-random、allkeys-lru、allkeys-random、no-enviction)
我们还可以根据业务需要进行自定义更新策略,常见的有:
1.定时更新
2.查询是否过期,如果过期则查询数据库,然后更新缓存。

缓存降级

概念

当访问量剧增、服务出现问题、或者非核心服务影响了核心服务的性能时,仍然需要保障服务可用时,需要对缓存降级。比如淘宝天猫双十一活动时,如果核心服务受到影响,那么那些相似产品推荐的服务缓存就可以进行降级,尽管对系统有损,但为了核心服务服务正常使用,必须进行降级。但有些服务就无法进行降级比如说:支付、购物车。应为他们都是核心服务。那这种我们只能通过加机器、加访问队列、熔断机制进行高可用的了。