什么是缓存穿透?
- 缓存穿透:缓存中查不到,数据库中也查不到。
- 解决方案:
- 对参数进行合法性校验
- 将数据库中没有查到结果的数据也写入到缓存。这时要注意为了防止Redis被无用的key占满,这一类缓存的有效期要设置得短一点。
- 引入布隆过滤器(BloomFilter),在访问Redis之前判断数据是否存在。要注意布隆过滤器存在一定的误判率(BloomFilter判断不在集合中则一定不在集合中,BloomFilter判断在集合中则可能不在集合中),并且布隆过滤器只能加数据不能减数据。
什么是缓存击穿?
- 缓存击穿:缓存中没有,数据库中有。一般是出现在存储数据初始化以及key过期了的情况。他的问题在于,重新写入缓存,需要一定的时间,如果是在高并发场景下,过多的请求就会瞬间写到DB上,给DB造成很大的压力。
- 解决方案:
- 设置这些热点缓存永不过期。这时要注意在value当中包含一个逻辑上的过期时间,然后另起一个线程,定期重建这些缓存。
- 加载DB的时候,要防止并发(加锁处理)。
什么是缓存雪崩?
- 缓存雪崩:缓存大面积过期,导致请求都被转发到DB。
- 解决方案:
- 把缓存的失效时间分散开。例如,在原有的统一失效时间基础上,增加一个随机值。
- 对热点数据设置永不过期。