旁路缓存:删缓存失败了怎么办
旁路缓存(Cache-Aside)用人话说:Redis 和数据库互不认识,全靠你的代码两边跑腿。
- 读:先查缓存,没有再去库里查,顺手放进缓存。
- 写:只改库,然后把缓存里那份旧的删掉,等下次有人读再重新放。
两种失败的后果不一样:
- 读库成功、写缓存失败:没关系,缓存还是空的,下次再查库就行。记个日志,别报错。
- 改库成功、删缓存失败:缓存里留着脏数据,要兜底。
兜底一般分三层:
- 当场重试几次。
- 还失败就扔进消息队列,或者订阅 binlog(比如 Canal),异步重试直到删掉。
- 所有缓存都设过期时间,最坏情况下也会自己失效。
为什么是「删缓存」而不是「更新缓存」?两个并发写可能以相反的顺序更新缓存,留下旧值。删掉、等下次读时再填,问题就小得多。