旁路缓存模式

旁路缓存模式 是平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景。服务端需要同时维系 DB 和 cache,并且是以 DB 的结果为准。

  • 先更新 DB
  • 然后直接删除 cache

  • 从 cache 中读取数据,读到就直接返回
  • cache 中找不到的话,就从 DB 中读取数据返回
  • 把从 DB 中读取放入 cache 中

缺陷

  • 首次请求的数据一定不在 cache 中。
    解决办法:
    • 可以将热点数据提前放入 cache 中
  • 写操作频繁的话,会导致 cache 中的数据被频繁删除,缓存命中率降低。
    解决办法:
    • 数据库与缓存数据强一致场景:在更新 DB 的同时更新 cache,添加一个锁来保证更新 cache 时不存在线程安全问题。
    • 可以短暂地允许数据库和缓存数据不一致的场景 :更新DB的时候同样更新cache,但是给缓存加一个比较短的过期时间,这样的话就可以保证即使数据不一致的话影响也比较小。

读写穿透

读写穿透 中服务端把 cache 视为主要数据存储,从中读取数据并将数据写入其中。cache 服务负责将此数据读取和写入 DB,从而减轻了应用程序的职责。

  • 先查 cache,cache 中不存在,直接更新 DB。
  • cache 中存在,先更新 cache,然后 cache 服务更新DB。

  • 从 cache 中读取数据,读取到就直接返回 。
  • 读取不到的话,先从 DB 加载,写入到 cache 后返回响应。

异步缓存写入

读写穿透异步缓存写入 两者都是由 cache 服务来负责 cache 和 DB 的读写。
读写穿透 是同步更新 cache 和 DB,而 异步缓存写入 则是只更新缓存,不直接更新 DB,而是改为异步批量的方式来更新 DB。