diff --git a/notes/pics/cache-aside-race.png b/notes/pics/cache-aside-race.png new file mode 100644 index 00000000..bd150ceb Binary files /dev/null and b/notes/pics/cache-aside-race.png differ diff --git a/notes/缓存.md b/notes/缓存.md index eb293c3c..1a6cffa1 100644 --- a/notes/缓存.md +++ b/notes/缓存.md @@ -128,6 +128,8 @@ CDN 主要有以下优点: 删除缓存而不是更新缓存,是因为两个并发的写操作到达缓存的顺序可能和到达数据库的顺序不同,导致缓存中是旧值。先更新数据库再删除缓存,是因为反过来的话,删除缓存之后、更新数据库之前的读请求会把旧值重新写入缓存。 +

+ 这种模式仍然存在小概率的不一致,例如删除缓存失败。常用的补救措施: - 为缓存设置过期时间作为兜底; diff --git a/tools/diagram/src/cache-aside-race.svg b/tools/diagram/src/cache-aside-race.svg new file mode 100644 index 00000000..92e67788 --- /dev/null +++ b/tools/diagram/src/cache-aside-race.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + 先删除缓存再更新数据库 + + + + + + + 写请求 + + + 缓存 + + + 数据库 + + + 读请求 + + ① 删除缓存 + + ② 读缓存未命中 + + ③ 读到旧值 + + ④ 更新为新值 + + ⑤ 把旧值写入缓存 + 缓存中一直是旧值,直到被删除或过期 +