穿透: 从缓存中查询一个数据,查到为空,需要每次都去数据库中查询。而从数据库中查询出来也为空,也就不写入缓存。导致一个不存在的数每次都去数据库中查询,造成db系统很大压力 造成缓存穿透
解决:如果从数据库中查询结果为空,我们也要缓存起来,避免下次访问缓存中没有,而去访问数据库
雪崩:缓存在一段是时间内失效,导致所有的查询都落在数据库上,甚至导致数据库宕机,造成缓存雪崩
解决:1.不同的key设置不同的过期时间
2.并发量不大的情况下,访问数据库的时候可以加锁排队 (高并发的情况下 不适用)
3 给缓存的数据设置一个缓存标记,记录是否失效, 另起一个线程去监测哪个缓存失效,如果失效,则更新缓存