【531、说一下缓存穿透和缓存击穿的区别?怎么解决?】

118 阅读2分钟

缓存穿透和缓存击穿都是指缓存中不存在需要查询的数据,但缓存又无法起到应有的作用,导致对底层系统的压力增大。

缓存穿透是指当一个查询请求的key在缓存和数据库中都不存在时,每次请求都会直接访问数据库,导致数据库压力增大。

解决方法:

  1. 布隆过滤器:使用一个布隆过滤器来缓存一些查询中不存在的数据,如果查询请求的key不存在于布隆过滤器中,直接返回查询失败,避免访问数据库。
  2. 缓存空对象:缓存空对象来避免重复访问数据库,当数据库中查询的结果为空时,将一个空对象缓存到缓存中,下次查询请求到达时,直接从缓存中返回空对象,避免重复查询数据库。

缓存击穿是指当一个高频访问的key失效后,每次请求都直接访问数据库,导致数据库压力增大。

解决方法:

  1. 延迟缓存更新:在缓存失效时,不直接更新缓存,而是先等待一段时间,让其他请求访问数据库并将数据更新到缓存中。等待时间过后,再将缓存更新为最新的数据。
  2. 二级缓存:在系统中增加一个二级缓存,当一级缓存失效时,先到二级缓存中查询数据,如果存在,直接返回;如果不存在,则访问数据库并将数据更新到缓存中。
  3. 加锁:在缓存失效时,通过加锁的方式,避免多个请求同时访问数据库,只允许一个请求访问数据库并更新缓存,其他请求等待缓存更新完成后再次查询即可。