Cache Aside

  • 失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
  • 命中:应用程序从cache中取数据,取到后返回。
  • 更新:先把数据存到数据库中,成功后,再让缓存失效。
  • Cavet: 先读数据库,放数据到缓存前有另外写数据库,缓存中放的是老数据:脏数据。
    • 要么通过2PC或是Paxos协议保证一致性,要么就是拼命的降低并发时脏数据的概率,而Facebook使用了这个降低概率的玩法,因为2PC太慢,而Paxos太复杂。当然,最好还是为缓存设置上过期时间。

Read/Write Through

  • 把更新数据库(Repository)的操作由缓存自己代理了
  • 应用认为后端就是一个单一的存储,而存储自己维护自己的Cache
  • Read Through
    • 在查询操作中更新缓存
    • 当缓存失效的时候(过期或LRU换出)
      • Read Through则用缓存服务自己来加载,从而对应用方是透明的。
      • Cache Aside是由调用方负责把数据加载入缓存,
  • Write Through
    • 如果没有命中缓存,直接更新数据库,然后返回。
    • 如果命中了缓存,则更新缓存,然后再由Cache自己更新数据库(这是一个同步操作)

Write Behind Caching