Redis缓存

旁路缓存:删缓存失败了怎么办

旁路缓存(Cache-Aside)用人话说:Redis 和数据库互不认识,全靠你的代码两边跑腿。

  • 读:先查缓存,没有再去库里查,顺手放进缓存。
  • 写:只改库,然后把缓存里那份旧的删掉,等下次有人读再重新放。

两种失败的后果不一样:

  • 读库成功、写缓存失败:没关系,缓存还是空的,下次再查库就行。记个日志,别报错。
  • 改库成功、删缓存失败:缓存里留着脏数据,要兜底。

兜底一般分三层:

  1. 当场重试几次。
  2. 还失败就扔进消息队列,或者订阅 binlog(比如 Canal),异步重试直到删掉。
  3. 所有缓存都设过期时间,最坏情况下也会自己失效。

为什么是「删缓存」而不是「更新缓存」?两个并发写可能以相反的顺序更新缓存,留下旧值。删掉、等下次读时再填,问题就小得多。

esc