Loading

缓存的三种更新模式

Cache Aside(旁路缓存)

最常使用的模式。一般由写操作删除cache,读操作设置cache

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

img

  • 从 cache 中读取数据,读取到就直接返回
  • cache 中读取不到的话,就从 db 中读取数据返回
  • 再把数据放到 cache 中。

img

缺陷

缺陷1:首次请求或更新删除cache后,cache不存在,当访问量较大时会将请求打到DB

  • 提前刷入热点数据到cache

缺陷2:可能出现以下情况,主要出现在query中的[select db] 到 [update cache]耗费时间较长,可能中间做了一些代码计算

img
  • 追求强一致。加入分布式锁,主要保证[clear cache][select db]-[update cache]的顺序。缺点影响并发
  • 非强一致。
    • 延时双删。当update[clear cache]完了之后,再做一次[clear cache]可以采用MQ延时消息,或其他异步手段来触发删除缓存动作
    • [update cache]操作时合理设置cache的失效时间兜底

Read/Write Through(读写穿透)

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

写(Write Through):

  • 先查 cache,cache 中不存在,直接更新 db。
  • cache 中存在,则先更新 cache,然后 cache 服务自己更新 db(同步更新 cache 和 db)。

img

读(Read Through):

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

img

与Cache-Aside比较

  • Cache-Aside的读操作由客户端负责写入cache,而Read-Through是由cache服务端负责写入cache,对客户端透明

Write Behind(异步缓存写入)

又叫Write Back。在更新数据的时候,只更新缓存,不更新数据库,缓存服务会异步地批量更新数据库

消息队列中消息的异步写入磁盘、MySQL 的 Innodb Buffer Pool 机制都用到了这种策略。非常适合一些数据经常变化又对数据一致性要求没那么高的场景,比如浏览量、点赞量。

Write-back_with_write-allocation

优势

  • 主要特性是I/O操作性能非常高
  • 缓存刷新操作由cache服务端来完成,与客户端解耦

缺陷

  • 数据不是强一致性的,而且可能会丢失

总结

  • Cache-Aside。最常用的策略,由客户端读操作做cache刷新,写操作做cache删除
  • Read/Write ThroughWrite Behind使用的一般较少。相同的是主要的刷新操作都由cache服务完成。
  • Read ThroughCache-Aside的读操作流程相似,不同的是Read Through是由cache服务端完成,对客户端透明
  • Write ThroughWrite Behind不同的是Write Behind只更新cache,不更新db,由cache服务异步批量更新db。而Write Through在没有读取到cache时会主动同步更新db

参考

posted @ 2023-04-20 17:34  FynnWang  阅读(378)  评论(0编辑  收藏  举报