这个方案其实和“先更新数据库,再删除缓存”差不多,因为还是会出现类似的问题:
假设线程A要更新数据库,先删除了缓存
这是线程B要读取缓存,在发现缓存为空,于是从数据库中获取当前值,填入缓存中;
之后线程A完成了更新数据库的操作
此时线程C也要访问缓存,此时它访问到的就是线程放到缓存里面的旧数据。
如果不存在线程C,线程B填入的缓存值,之后便会被线程A删除,因此并不会出现数据不一致。要想出现不一致,必须有第三个线程C,恰巧在线程A的第二步和第三步的间隙,试图获取缓存数据才会发生数据不一致。
因此,此种方案遇到数据不一致的概率相较于其他方案最低。