8000 docs: update redis-consistence.md · lhzctf/advanced-java@fe5ee74 · GitHub
[go: up one dir, main page]

Skip to content

Commit fe5ee74

Browse files
committed
docs: update redis-consistence.md
1 parent f0cccea commit fe5ee74

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

docs/high-concurrency/redis-consistence.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,21 @@
3737

3838
![redis-junior-inconsistent](./images/redis-junior-inconsistent.png)
3939

40-
解决思路:先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。
40+
解决思路 1:先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。
41+
42+
解决思路 2:延时双删。依旧是先更新数据库,再删除缓存,唯一不同的是,我们把这个删除的动作,在不久之后再执行一次,比如 5s 之后。
43+
44+
```java
45+
public void set(key, value) {
46+
putToDb(key, value);
47+
deleteFromRedis(key);
48+
49+
// ... a few seconds later
50+
deleteFromRedis(key);
51+
}
52+
```
53+
54+
删除的动作,可以有多种选择,比如:1. 使用 `DelayQueue`,会随着 JVM 进程的死亡,丢失更新的风险;2. 放在 `MQ`,但编码复杂度为增加。总之,我们需要综合各种因素去做设计,选择一个最合理的解决方案。
4155

4256
### 比较复杂的数据不一致问题分析
4357

0 commit comments

Comments
 (0)
0