最近写项目 用到redis,想要把其中的主要问题和大家分享一下:
首先是 穿透
个人的理解因为查询一个不存的数据是,因为第一次查询是到数据库,所以要查询这个不存的数据时会越过redis
直接去数据库查询,所以才会形成穿透;
解决办法:
最常见的是布隆过滤器,将所有的数据哈希到一个足够大的bitmap中,不存在的数据会被bitmap掉,
还有一种方法就是将查询结果不论是不是空都存入缓存,不过将为空的缓存时间减短,不超过5分钟。。
雪崩
是和穿透有很大联系的,在缓存失效的这段时间,发生大量的穿透,所有的查询到达服务器,形成雪崩
解决办法
- 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
- 可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存
- 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
- 做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。