Java面试题

题目

对缓存雪崩,穿透了解吗?讲讲其出现的场景和解决方案。

答案

缓存雪崩

redis 里面的 key 的同时失效,原先访问 redis 的数据都访问到数据库上面,导致数据库压力增大。

解决方案:

  1. 在设置 redis 的 key 的过期时间的时候随机生成,而不是把所有的过期时间都设置成一个时间点。
  2. 在查询的时候,可以加锁排队,这样的话,避免大批量并发查询。

缓存穿透

用户过来查询数据的时候,在 redis 里面没有,在 db 里面也没有,用户每次都过来查询相同的 key 的数据,每次都会打到 db 上面。

解决方案:

  1. 可以使用布隆过滤器,将所有可能有数据的信息存放在一个足够大的 bitmap 中,如果数据在这个里面不存在,那么可能不会在缓存中存在。
  2. 如果从 db 中返回的结果是空的,那么就直接将空存储到 redis 里面,下次过来查询的时候,就直接返回空。