作者回复: 你好,能否进一步解释一下第 2 条?
作者回复: R1 是读请求,R2 是更新请求:
1. R1 读缓存,发现已失效,就从数据库里读出旧值 Va;
2. R2 更新请求,将数据库里的值从 Va 更新为新值 Vb,并将缓存标记为失效;
3. R1 将 Va 写回缓存,于是缓存中就有了一个过期值 Va,而数据库中是 Vb。
我说这个情况极小概率出现的原因有这样几个:
1. 需要缓存自身过期和数据更新几乎同时发生;
2. 需要 R1 在读出旧值以后,R2 的更新操作全部完成,R1 才将旧值写入缓存,而众所周知从数据库中读数据并写入缓存的操作速度,通常情况下要远高于数据库更新并将缓存标记为失效的操作,因为写操作需要的要求更高,比如需要使用事务等等。当然,这说的是“通常情况”,并不是 说“一定”,不过出问题的概率是非常非常小的。
作者回复: 就是 trade-off,write-back 带来高吞吐量的同事,会牺牲一定的一致性(数据库和缓存可能不一致)和持久性(可能存在掉电数据丢失),你说的“高并发的时候”,如果可以做出这样的牺牲,那么就可以考虑这个方法