缓存雪崩指的是在同一时刻,缓存大量失效,致使大量的请求直接到了数据库,数据库压力剧增,引发系统崩溃。可能出现的状况有:
①大量的key设置了相同的过时时间,致使在缓存在同一时刻所有失效,形成瞬时DB请求量大、压力骤增,引发雪崩。
②缓存系统出现故障,形成缓存系统没法提供服务,形成瞬时DB请求量大、压力骤增,引发雪崩。redis
事前 :
①在设置key的过时时间时,在过时时间上加上一个随机值,防止大量key同时过时。
②搭建高可用的缓存架构,好比使用 哨兵+主从 结构或者使用 cluster模式,避免缓存系统出现故障。
③能够在系统中使用ehcache作个小缓存,防止redis崩掉以后,还有一部分缓存。
事中 :
①对系统请求进行降级和限流,防止数据库之间崩掉。
过后 :
赶快使用redis持久化的数据,快速恢复缓存数据数据库
缓存穿透是指有请求访问到了并不存在的数据,这样请求就会直接到达数据库,数据库就会压力剧增。缓存
①能够使用一个足够大的bitmap,将可能存在的key放到里面,请求过来先检查bitmap里面有么有,若是没有直接过滤掉这个请求。
②将数据库查询出来的空值也放到缓存里面去,是这个key对应一个空值,只是这个key设置的时间比较短。架构
一个存在的key,在缓存过时的一刻,同时有大量的请求,这些请求都会击穿到数据库,形成数据库请压力骤增。it
在访问key以前,采用SETNX(set if not exists)来设置另外一个短时间key来锁住当前key的访问,访问结束再删除该短时间key。class