mirror of
https://github.com/doocs/advanced-java.git
synced 2026-08-18 10:43:29 +08:00
docs: update redis-consistence.md
This commit is contained in:
@@ -37,7 +37,21 @@
|
||||
|
||||

|
||||
|
||||
解决思路:先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。
|
||||
解决思路 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`,但编码复杂度为增加。总之,我们需要综合各种因素去做设计,选择一个最合理的解决方案。
|
||||
|
||||
### 比较复杂的数据不一致问题分析
|
||||
|
||||
|
||||
Reference in New Issue
Block a user