docs: update redis-consistence.md

This commit is contained in:
yanglbme
2021-07-09 20:10:28 +08:00
parent f0cccea6ad
commit fe5ee74784

View File

@@ -37,7 +37,21 @@
![redis-junior-inconsistent](./images/redis-junior-inconsistent.png)
解决思路:先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。
解决思路 1:先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。
解决思路 2延时双删。依旧是先更新数据库再删除缓存唯一不同的是我们把这个删除的动作在不久之后再执行一次比如 5s 之后。
```java
public void set(key, value) {
putToDb(key, value);
deleteFromRedis(key);
// ... a few seconds later
deleteFromRedis(key);
}
```
删除的动作可以有多种选择比如1. 使用 `DelayQueue`,会随着 JVM 进程的死亡丢失更新的风险2. 放在 `MQ`,但编码复杂度为增加。总之,我们需要综合各种因素去做设计,选择一个最合理的解决方案。
### 比较复杂的数据不一致问题分析