缓存击穿、雪崩和穿透
缓存穿透
概念:
访问一个不存在的key,缓存不起作用,请求会穿透到DB(数据库),流量大时DB会挂掉
解决方法:
之所以发生穿透,是因为缓存中没有存储这些数据的key,从而每次都查询数据库,我们可以为这些key在缓存中设置对应的值为null,后面查询这个key的时候就不用查询数据库了,(访问key未在DB查询到值,也将空值写进缓存,设置较短过期时间)
缓存击穿
概念:
在高并发的情况下,大量的请求同时查询同一个key时,此时这个key正好失效了,就会导致同一时间,这些请求都会去查询数据库,这样的现象我们称为缓存击穿。
解决方案:
采用分布式锁,每次拿到锁的时候都要去查询一下缓存有没有、查不到缓存的情况下,只有拿到锁的第一个线程去请求数据库,然后插入缓存。
缓存雪崩
概念:
缓存服务或春失效、大量数据访问DB、、当某一时刻发生大规模的缓存失效的情况,缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。
解决方案:
采用集群,降低服务宕机的概率
可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。