Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

缓存更新方法

  • 先删缓存,再更新数据库

    • 有问题,不能采用
      • 如果删了缓存后,刚好有一个并发查询过来,缓存没有,从数据库拿到了旧数据,更新到缓存中
      • 这样就导致了脏数据
  • 先更新数据库,再删缓存

    • 业界常用方案
    • 但也有一点点问题,但发生概率极小
      • 当缓存初始值是空或者失效时,刚好有一个并发查询过来,缓存没有,从数据库拿到了旧数据,在写操作写完新数据,并删除缓存后,这个并发请求才更新到缓存中
      • 这样就导致了脏数据
  • 先更新数据库,再更新缓存

    • 有更好的读性能,但写性能较低
    • 可以避免缓存穿透
    • 也有一点问题
      • 如果两个并发写操作,一个更新了数据库,另一个接着更新数据库,然后又更新缓存,前一个才更新到缓存中。
      • 这样就导致脏数据
  • read/write through缓存代理

    • 由缓存层统一代理数据库的读写
      • 读数据时,若缓存未命中,会自动去数据库加载数据到缓存,然后交给应用
      • 写数据时,更新完缓存后,再同步写数据库
  • write back写回

    • 更新数据时,只更新缓存,不更新数据库
    • 缓存会异步批量地更新数据库
    • 无法保证数据的强一致性,而且会存在数据丢失的可能