记一次缓存一致性中延迟双删的使用场景

发布时间 2023-09-23 16:24:04作者: 烟花火的人生

1、背景:

 前边写了个这样的业务需求:从算法服务那边会不断的发送过来一些预警的数据和预警恢复的数据,当有新预警数据过来时,会进行数据库记录和redis缓存,当有该预警的恢复过来时会将数据库状态修改并清除缓存,我的做法是使用了缓存双删的策略,即先删缓存,再更新数据库,再删缓存。

但是此时还是出现了问题,就是页面上某个使用我缓存的地方出现了显示的不正确,经过查询,发现数据库里这条数据已经是恢复状态,但是缓存里还是有预警,这就是数据库和缓存不一致导致的问题,比较老生常谈了。

2、方案:

经过排查,发现是我在进行第二次删除缓存的时候,并没有进行延迟,这就可能会出现问题,主要出问题的逻辑如下:

A线程在收到预警恢复的数据后,先删除了缓存,此时B线程过来查询,发现缓存中没有数据,则查数据库,但是还没更新缓存,此时B线程的时间片用完,轮到A线程进行更新数据库操作,A顺利的更新了数据库,然后A线程执行了第二次删除缓存操作,但是缓存中其实还没有数据,所以A其实删除了个空,此时B线程继续执行,B线程将数据库中查到的旧值更新到了缓存中,这就导致缓存和数据库不一致。

所以我再第二次删除缓存处加了个线程sleep100ms,但是其实还是有问题,我应该让线程sleep多长时间才合适呢?这个问题我并没有深究,等有空了再详细研究一下吧。