首页/数据/NoSQL 速查/旁路缓存模式与失效顺序
选型与架构50 条

旁路缓存模式与失效顺序

旁路缓存由应用负责读穿与写后失效:读 miss 回源并回填带 TTL 的值;写路径先落库再删除缓存键。反过来先删缓存再写库会留下旧值回填窗口,删除失败要重试补偿,TTL 作为最终兜底。

NoSQL 速查数据更新于 2026-10-12

读写流程(伪代码)

读写流程(伪代码)
def get_user(uid):
    v = cache.get(key(uid))
    if v is not None:
        return v
    u = db.query(uid)
    cache.set(key(uid), u, ttl=300 + rand(60))
    return u

def update_user(u):
    db.update(u)            # 先写数据库
    if not cache.delete(key(u.id)):
        retry_queue.push(key(u.id))   # 删除失败进补偿队列

写入策略

策略行为风险
cache-aside写库后删缓存,读时回填删除失败出现旧值窗口
write-through写缓存同时写库(同步)写延迟变高
write-behind先写缓存,异步刷库进程崩溃可能丢写
删除而不是更新缓存:并发双写下更新操作可能把旧值写回;删除天然幂等,配合 TTL 最终收敛。

易错点

  • 主从延迟期间从库读到的旧值可能被回填进缓存,读路径固定读主库或做延迟双删更稳
  • 缓存删除失败没有补偿时,旧值会一直保留到 TTL 到期,需要监控删除失败率

数据来源与参考

  • Redis Docs: Client-side caching
  • AWS Architecture Blog: Caching challenges and strategies
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌