redis延迟删除和主动更新

redis延迟删除和主动更新
最新回答
媤惗ら

2023-04-14 03:11:33

Redis的延迟删除主要通过“延时双删”策略实现,主动更新则依赖Cache Aside、Read/Write Through等模式,二者共同用于维护缓存与数据库的一致性。

延迟删除:延时双删策略

延迟删除的核心是“延时双删”,具体步骤如下:

  1. 第一次删除缓存:在更新数据库前,先删除Redis中的缓存数据。
  2. 更新数据库:执行数据库的更新操作。
  3. 延时等待:等待数据库更新完成(如500毫秒),确保并发查询不会读取到旧数据。
  4. 第二次删除缓存:再次删除Redis中的缓存,清除可能因并发查询导致的脏数据。

目的:通过两次删除避免并发操作导致的数据不一致。例如,第一次删除后,若其他线程查询缓存未命中并从数据库读取旧数据写入缓存,第二次删除可彻底清除这些脏数据。

主动更新:同步缓存与数据库

主动更新策略在数据库数据变更时同步更新Redis缓存,常见方案包括:

  1. Cache Aside Pattern

    操作流程:调用者在更新数据库时删除缓存(而非直接更新),后续查询时再更新缓存。

    优势:减少无效写操作(如数据库更新100次,缓存只需删除1次)。

    问题:需处理操作顺序问题(先删缓存再更新数据库,或先更新数据库再删缓存),均可能导致脏数据。

  2. Read/Write Through Pattern

    操作流程:缓存与数据库整合为一个服务,调用者直接操作该服务,由服务维护一致性。

    问题:服务维护复杂,市面上无完善解决方案。

  3. Write Behind Caching Pattern

    操作流程:调用者只操作缓存,由异步线程将缓存数据持久化到数据库。

    问题:若异步线程未完成持久化时Redis宕机,会导致数据丢失。

一致性场景与兜底方案
  • 高一致性场景:通常采用“Cache Aside Pattern”结合“延时双删”策略,以“先更新数据库,再延时删除缓存”的方式,降低并发导致的不一致风险。
  • 低一致性需求:可使用内存淘汰机制(如店铺类型查询缓存),但不可控。
  • 高一致性需求:主动更新为主,超时剔除为兜底方案(如店铺详情查询缓存)。超时剔除通过设置TTL(过期时间)实现,但一致性取决于TTL设置。