ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

如何保证数据库与 Redis 的数据一致性

如何保证数据库与 Redis 的数据一致性

目录

读场景

写场景

延时双删

先删除 Redis 中的数据,还是先修改数据库

先删除 Redis,再修改数据库

先修改数据库,再删除 Redis

为什么要两次删除 Redis 中的数据

为什么要延时一段时间

需要保证强一致性

分布式锁

共享锁与排他锁

可以有一定的延时

使用 MQ 中间件

使用 Canal 中间件


对于这个问题,分为读场景和写场景。

读场景

客户端发送请求后,会先从 Redis 中获取信息,若获取到,就直接返回;若没有获取到,就会查询数据库,并将查询到的数据写回 Redis 中,从而保证数据库与 Redis 的数据一致性。

写场景

对于写场景,由于数据库中的数据发生了改变,需要将 Redis 中的数据也同步进行改变,这就涉及到了数据的一致性问题。

延时双删

先删除 Redis 中的数据,再修改数据库中的数据,延迟一段时间后再次删除 Redis 中的数据。

对于延时双删,有下面几个问题:

先删除 Redis 中的数据,还是先修改数据库

在下面的情景中,Redis 与数据库中存储的数据均为 10。

先删除 Redis,再修改数据库

第一种情况:

现有两个线程,线程1 先将缓存删除,再将数据库中的数据更新为 20。这时线程2 查询数据,由于此时数据库中的数据还未同步至 Redis 中,那么线程2 在 Redis 中查询不到数据,就会从数据库中查询到 20,并将 20 写回 Redis 中。此时 Redis 与数据库中的数据是一致的。

第二种情况:

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进