如何防止Redis缓存失效时大量查询穿透缓存

假设我们有一个sql查询将会耗时2秒。
我们给这个sql查询结果缓存到redis并设置60秒超时时间。
那么在60秒到达的时候,也就是60到62秒的两秒钟,可能几百个请求都没有命中缓存而直接去查询数据库了。
请问如何防止这种情况发生呢?

阅读 4.8k
2 个回答

这个是缓存雪崩: 如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

缓存雪崩解决方法:

  1. 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
  2. 可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存
  3. 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
  4. 做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。

来源: https://blog.csdn.net/m0_3811...

预估一下缓存数据的最大被使用的时长,60秒不是随便设的,是根据场景需求来的,设个长一点的时间。别的办法还真不知道,已关注,期待别的答案

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进