缓存穿透/雪崩/击穿

缓存穿透

访问透过缓存直接访问数据库。通常是一个不存在的key, 在数据库查询时又没有结果, 然后又没有做缓存, 导致每次的请求都落在数据库上,并且高并发, 数据库扛不住挂掉。

解决方案:

  • 数据库中查询不到数据时, 仍然做缓存, 只是把有效时间缩短
  • 拦截无效的请求,过滤key
  • 屏蔽恶意的请求
  • 使用布隆过滤器过滤key

缓存雪崩

雪崩,就是某东西蜂拥而至的意思,像雪崩一样。通常是缓存大规模失效,在高并发情况下大量访问数据库。

解决方案:

  • 通过在key的失效时间上加一个随机值,让key失效的时间更均匀
  • 热点数据, 建议cron定时更新,避免失效

缓存击穿

非常热点的key,在不停的扛着大并发。 在其失效的瞬间,持续的大并发就直接请求到数据库,就好像暴力击穿一样。

击穿与穿透不同。 穿透是想办法绕过缓存而直接请求db使db挂掉。而击穿可以理解为正面大力的击穿,通常为大量请求同时操作同一个key, 在该key失效的瞬间大量请求db导致db挂掉.

解决方法:

  • 设置热点数据永远不过期
  • 使用互斥锁避免大量请求同时落到db (缓存中没有数据, 给key加锁,然后获取数据, 其他的数据请求操作等待,避免同时取数据库请求再同时大量更新同一个key)
  • 做熔断、降级,防止系统崩溃
  • 使用布隆过滤器, 判断某个容器是否在集合中(what's?)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章