doocs / advanced-java

😮 Core Interview Questions & Answers For Experienced Java(Backend) Developers | 互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识
https://doocs.github.io/advanced-java
Creative Commons Attribution Share Alike 4.0 International
76.18k stars 19.07k forks source link

关于缓存一致性部分的一个建议 #298

Open CaoChunfang opened 8 months ago

CaoChunfang commented 8 months ago

关于缓存一致性部分我看举了这样一个例子,就先删除缓存,再更新,在还没更新成功的时候来了一个读请求,因为缓存为空所以去读库,结果读到了旧数据并缓存了下来,此时更新操作也成功了,就可能导致缓存不一致的问题。然后我看给的解决方案是用内存列队,等专门用一个线程去更新缓存,感觉这有些复杂了。 我就想知道这里可不可以删两次缓存,第一次删除缓存,然后更新库,更新成功之后再删除一次缓存。这样就算上面说的库还没更新成功来了一个读请求更新了缓存也无所谓,因为马上会被再次删掉,这样不就不会导致不一致的问题了吗?也不知道这种方式有没有其他问题。

yongroot commented 8 months ago

邮件已经正常接收。我会尽早查看,谢谢。

biggerboy commented 7 months ago

缓存旧数据这一步如果在第二次删除执行以后执行呢,也会不一致

2442603467 commented 7 months ago

如果是双删一致性方案的话,写请求为三步骤,假设为1删,2写db,3删。 读请求为两步,1读,2写cache 在这个场景下,一定是先1删,1读,然后剩下的三步操作的顺序不可控。如果是先执行2写db,3删,2写cache的话,缓存依旧与db内容不同。 双删一致性方案的第二次删除可以延迟1s或1s内,这样的话能够保证最多有1s的缓存不一致的情况。

miracle485 commented 7 months ago

第一次删缓存是完全没有必要的吧,既然数据源还没有更新,删除缓存的意义在哪里,如果数据更新成功,第二次删就足够了,如果数据更新失败,删缓存只是增加了不必要的数据库访问