redis缓存三⼤问题及解决⽅案
缓存穿透
缓存穿透指的是业务系统访问不存在的数据,导致⼤量请求打到数据库,造成的数据库压⼒,甚⾄奔溃,此称为缓存穿透。 解
决⽅案:
(⼀)缓存空数据
如果从数据库中没查到值,可以在缓存中记录⼀个空值,来避免“缓存穿透”。并且要给这个空值设置⼀个较短的过期时间。(如果时 间
过长,会导致数据库更新后的数据不能及时更新到redis)
缓存空对象会有两个问题:
1.
第⼀,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间 ( 如果是攻击,问题更严重 ),⽐较有效的⽅法是针
对这类数据设置⼀个较短的过期时间,让其⾃动剔除。
2.
第⼆,缓存层和存储层的数据会有⼀段时间窗⼝的不⼀致,可能会对业务有⼀定影响。例如过期时间设置为 5 分钟,如果此
时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不⼀致,此时可以利⽤消息系统或者其他⽅式清除
掉 缓存层中的空对象。
(⼆)BloomFilter(空数据的key各不相同、key重复请求概率低)
⾸先将BloomFilter⾥⾯存储⽬前数据库中存在的所有key,当业务系统有查询请求的时候,⾸先去BloomFilter中查询该key是否存
在。若不存在,则说明数据库中也不存在该数据,因此缓存都不要查了,直接返回null。若存在,则继续执⾏后续的流程,先前往缓存
中查询,缓存中没有的话再前往数据库中的查询。Redisson利⽤Redis实现了Java分布式布隆过滤器(Bloom Filter)。所含最⼤⽐
特数量为2^32。
缓存雪崩
缓存⼤量key集中失效(如缓存过期或服务不可⽤),导致⼤量请求同时穿透到数据库的情况,就是所谓的“雪崩效应”
解决⽅案:
使⽤缓存集群(Redis Sentinel 和 Redis Cluster),保证缓存⾼可⽤。
当我们向缓存初始化数据时,要保证每个缓存记录过期时间的离散性。可以采⽤⼀个较⼤的固定值加上⼀个较⼩的随机值。⽐如过期时
间
可以是:10⼩时 + 0到3600秒的随机值。
缓存击穿