缓存击穿
热点数据失效,大量请求打入mysql
解决方案:设置热点数据永不过期
缓存穿透
数据库中不存在该数据,缓存不起作用
解决方案:
1、对请求参数进行校验,排除掉不合理的入参
2、将null作为值存储到redis中(不推荐)
3、布隆过滤器
通过不同的hash算法,将key转成bitmap中的一位将该位设为1。
查询key是否存在时,根据hash算法计算出在bitmap中对应的位数,如果所有hash算法算出的位数都为1,则可能存在,如果存在0,则必然不存在。
布隆过滤器实现
RedissonClient redisson = Redisson.create(config);
RBloomFilter
//初始化布隆过滤器:预计元素为100000000L,误差率为3%
bloomFilter.tryInit(100000000L,0.03);
//将号码10086插入到布隆过滤器中
bloomFilter.add(“10086”);
//判断是否存在
bloomFilter.contains(“123456”)
缓存雪崩
大量数据同一时间失效,大量请求打入mysql
解决方案:过期时间随机分布
缓存预热
将热点数据、大数据提前放到缓存中
实现:
1、在启动时查询出热点数据,放入缓存中
2、自动任务将需要加工的数据加工完放入缓存中