Cache problems
缓存穿透(cache penetration)
缓存穿透指既不存在缓存也不存在于数据库的数据被访问,所有的查询请求都直接打到数据库。这种数据可能被恶意请求,对数据库造成压力。
Solution:
- 对请求进行初步检查,过滤掉显然非法的访问。
- 在缓存写入 empty 数据,并设置一个较短的过期时间。
- 使用 Bloom filter。
缓存击穿(cache breakdown)
缓存击穿指某条热点数据不在缓存中,同时有大量的请求访问该数据,所有的请求将打到数据库。
Solution:
- 热点数据永不过期,同时使用后台任务主动更新缓存,而不是被动写入缓存。
- 使用互斥锁,当缓存不存在时,只允许一个请求查询数据,其它未获取到锁的请求将挂起直到缓存ready。为避免过多挂起请求,挂起的请求到一定数量后将直接返回失败响应。
缓存雪崩(cache avalanche)
缓存雪崩指短时间内大批量缓存失效或者缓存服务不可用,请求压力直接来到数据库。通常同样的过期时间可能引起类似的问题。
Solution:
- 为缓存过期时间加上一个随机的偏移量。
- 如果是热点数据,在服务启动时就主动将数据加载进缓存,同时不设置过期时间。
- 设置 backup 缓存服务提高缓存可用性。
- 对数据库访问限流,避免大量请求将数据库击溃。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃胡萝卜!