Skip to content

Latest commit

 

History

History
37 lines (28 loc) · 2.11 KB

2024-11-14-一文讲透数据库缓存一致性问题.md

File metadata and controls

37 lines (28 loc) · 2.11 KB

一文讲透数据库缓存一致性问题

TL;DR

本文探讨了缓存的意义、一致性挑战、更新策略,以及如何保证最终一致性,并介绍了消息中间件和订阅binlog等解决方法。

Summary

  1. 缓存的意义

    • 使用空间换时间,通过更高速的空间(如Redis)提升读性能。
    • 更快的存储介质,如Redis,和本地内存(一级缓存)。
  2. 一致性挑战

    • 缓存和数据库之间的一致性问题,由于两者没有事务保证,可能出现数据不一致。
    • 一致性问题无法完全消除,但可通过设计减少不一致时间窗口。
  3. 更新缓存手段

    • cache-aside策略:优先查询缓存,查询不到才查询数据库。
    • 更新策略:包括更新数据库后更新缓存、更新数据库前更新缓存、更新数据库后删除缓存、更新数据库前删除缓存。
  4. 不一致性问题分析

    • 更新数据库后更新缓存:可能出现数据库更新成功但缓存未更新成功的情况。
    • 更新缓存后更新数据库:可能出现缓存更新成功但数据库未更新成功的情况。
    • 删除缓存:可能出现删除缓存操作失败的情况。
  5. 最终一致性保证

    • 缓存设置过期时间:通过设置缓存过期时间,即使更新失败,最终也能达到一致。
  6. 减少删除/更新失败

    • 消息中间件:利用消息中间件的机制,如ATLEAST-ONCE机制,减少删除/更新失败。
  7. 处理复杂的多缓存场景

    • MQ消息:通过MQ消息将更新缓存的操作发送出去,由不同系统订阅并处理。
  8. 订阅MySQL binlog

    • Canal:利用Canal订阅数据库binlog变更,集中处理缓存更新。