高并发下如何保证缓存和数据库的数据一致性?( 二 )


高并发下如何保证缓存和数据库的数据一致性?
本文插图

应用场景
Read Through/Write Through适用于写入之后经常被读取的应用 。
优点

  • 缓存不存在脏数据
  • 相比较Cache-Aside懒加载模式 , 读取速度更高 , 因为较少因为缓存未命中而从数据库中查找
  • 应用程序的逻辑相对简单
缺点
  • 对于总是写入却很少被读取的应用 , 那么Write-Through会非常浪费性能 , 因为数据可能更改了很多次 , 却没有被读取 , 白白的每次都写入缓存造成写入延迟 。
除了Write-Through以外 , 我们还有另外的两种写模式可以和Read-Through一起来配合使用 , 分别是Write-Back和Write-Around 。
Write-Back
又叫做Write-Behind 。 和Write-Through写入的时机不同 , Write-Back将缓存作为可靠的数据源 , 每次都只写入缓存 , 而写入数据库则采用异步的方式 , 比如当数据要被移除出缓存的时候再存储到数据库或者一段时间之后批量更新数据库 。
高并发下如何保证缓存和数据库的数据一致性?
本文插图

应用场景
读写效率都非常好 , 写的时候因为异步存储到数据库 , 提升了写的效率 , 适用于读写密集的应用 。
优点
  • 写入和读取数据都非常的快 , 因为都是从缓存中直接读取和写入 。
  • 对于数据库不可用的情况有一定的容忍度 , 即使数据库暂时不可用 , 系统也整体可用 , 当数据库之后恢复的时候 , 再将数据写入数据库 。
缺点
  • 有数据丢失的风险 , 如果缓存挂掉而数据没有及时写到数据库中 , 那么缓存中的有些数据将永久的丢失了
Write-Around
和Write-Through不同 , 更新的时候只写入数据库 , 不写入缓存 , 结合Read-Through或者Cache-Aside使用 , 只在缓存未命中的情况下写缓存 。
高并发下如何保证缓存和数据库的数据一致性?
本文插图

应用场景
适合于只写入一次而很少被读取的应用 。
优点
  • 相比较Write-Through写入的时候的效率较高 , 如果数据写入后很少被读取 , 缓存也不会被没用到的数据占满 。
缺点
  • 如果数据会写入多次 , 那么可能存在缓存和数据库不一致
转自:GitHub 作者: stephanie Tang
stephanietang.github.io/2020/04/13/cache-pattern/


推荐阅读