缓存双写不一致

一致性的问题很常见,因为加入了缓存之后,请求是先从 redis 中查询,如果 redis 中 存在数据就不会走数据库了,如果不能保证缓存跟数据库的一致性就会导致请求获取到的数 据不是最新的数据。
解决方案:
1、编写删除缓存的接口,在更新数据库的同时,调用删除缓存 的接口删除缓存中的数据。这么做会有耦合高以 及调用接口失败的情况。
2、消息队列:ActiveMQ,消息通知

缓存雪崩

原因:
缓存雪崩,即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。
解决方案:
1、给缓存的失效时间,加上一个随机值,避免集体失效。
2、一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
3、搭建 redis 集群。
4、设置热点数据永远不过期

缓存击穿

原因:
某一个热点数据,缓存中某一时刻失效了,因而大量并发请求打到数据库上, 说白了,就是某个数据,数据库有,但是缓存中没有。
解决方案:
1、设置热点数据永远不过期。
2、加大此类信息key的过期时长 (每次请求都重新刷新一次寿命)
3、使用定时任务,当高峰期来临之前,刷新数据有效期,确保不丢失
4、加分布式锁,防止被击穿

缓存穿透

原因:
故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上, 从而数据库连接异常。
解决方案:
1、利用互斥锁,缓存失效的时候,先去获得锁,得到锁了, 再去请求数据库。没得到锁,则休眠一段时间重试
2、对查询结果为null的数据进行缓存(长期使用,定期清理),设定短时限,例如30-60秒,最高5分钟