Java面试题
题目
对缓存雪崩,穿透了解吗?讲讲其出现的场景和解决方案。
答案
缓存雪崩
redis 里面的 key 的同时失效,原先访问 redis 的数据都访问到数据库上面,导致数据库压力增大。
解决方案:
- 在设置 redis 的 key 的过期时间的时候随机生成,而不是把所有的过期时间都设置成一个时间点。
- 在查询的时候,可以加锁排队,这样的话,避免大批量并发查询。
缓存穿透
用户过来查询数据的时候,在 redis 里面没有,在 db 里面也没有,用户每次都过来查询相同的 key 的数据,每次都会打到 db 上面。
解决方案:
- 可以使用布隆过滤器,将所有可能有数据的信息存放在一个足够大的 bitmap 中,如果数据在这个里面不存在,那么可能不会在缓存中存在。
- 如果从 db 中返回的结果是空的,那么就直接将空存储到 redis 里面,下次过来查询的时候,就直接返回空。