2022-04-28 15:59:35
Redis缓存延时双删的原因主要如下:
保证数据库与缓存数据一致性
在修改数据库数据前,先删除一次Redis缓存,是为了防止在数据库修改过程中,仍有请求命中缓存并读取到旧数据。若未进行首次删除,当数据库已完成修改,但缓存中仍存在旧数据时,后续请求会直接从缓存获取错误信息,导致数据不一致。
清除可能被重新缓存的旧数据
在数据库修改完成后,需再次删除Redis缓存。这是因为首次删除后,若存在其他线程在数据库修改期间读取了旧数据,并尝试将其重新写入缓存(例如通过缓存穿透场景下的数据回填),此时缓存中会再次出现脏数据。第二次删除可彻底清除这类数据,确保缓存与数据库最终一致。
延时删除的必要性
第二次删除需延迟执行,是为了等待所有可能因首次删除触发的缓存回填操作完成。例如,在首次删除后,若有线程从数据库读取旧数据并写入缓存,延迟时间需覆盖“数据库查询+数据写入缓存”的耗时。若立即删除,可能遗漏部分正在回填的脏数据,导致一致性失效。
延时双删的局限性
尽管延时双删能提升一致性,但其延迟时间难以精准确定。若延迟过短,可能无法覆盖所有缓存回填操作;若延迟过长,会降低系统性能。因此,实际场景中常采用其他方案替代,例如: