redis缓存双写
文档
官方文档
下载地址
说明
- 版本选择:
redis-7.0.0.tar.gz - 下载地址:https://download.redis.io/releases/redis-7.0.0.tar.gz
redis缓存双写
安装redis
- 以单机版redis为例,安装redis参考文档:redis单机安装
什么是缓存双写
- 缓存双写是一种缓存更新策略,在数据更新时同时更新数据库和缓存,确保两者数据一致性
为什么缓存双写会存在一致性问题
- 数据库和缓存是两个独立的存储系统,无法保证更新操作的原子性;当一个操作成功而另一个失败时,或在并发场景下操作顺序不可控时,就会导致数据不一致。
缓存双写常见的模式及存在的问题
先更新数据库,再删除缓存(推荐)
-
举例说明
线程A 线程B 线程C DB状态 Cache状态 说明 场景一 t0 100 100 初始值 t1 更新数据库->200 200 100 更新数据库 t2 查询缓存->100 200 100 删除缓存前查询到的是旧值 t3 删除缓存 200 空 删除缓存 场景二 t0 100 100 初始值 t1 更新数据库->200 200 100 更新数据库 t2 删除缓存,删除失败 200 100 删除缓存,删除失败 t4 查询缓存->100 删除缓存失败,查询到的是旧值 场景三 t0 100 100 初始值 t1 更新数据库->200 200 100 t2 删除缓存 200 空 t3 查询缓存->空 200 空 t4 查询数据库->200 200 空 多个线程同时查询数据库会导致缓存击穿 t5 写入缓存->200 200 200 t6 查询(缓存)->200 200 200 一致 -
存在的问题
-
缓存删除失败,读到的是旧值
-
缓存删除前,短暂读到旧值
-
删除缓存后,大量请求同时查询数据库,导致缓存击穿
-
先更新数据库,再更新缓存
-
举例说明
线程A 线程B 线程C DB状态 Cache状态 说明 场景一 t0 100 100 初始值 t1 更新数据库->200 200 100 更新数据库 t2 查询缓存->100 200 100 更新缓存前查询到的是旧值 t3 更新缓存 200 200 更新缓存 场景二 t0 100 100 初始值 t1 更新数据库->200 200 100 更新数据库 t2 更新缓存,更新失败 200 100 更新缓存,更新失败 t4 查询缓存->100 更新缓存失败,查询到的是旧值 场景三 t0 100 100 初始值 t1 更新数据库->200 200 100 t2 更新数据库->300 300 100 t3 更新缓存->300 300 300 t4 更新缓存->200 300 200 t5 查询缓存->200 300 200 数据库、缓存不一致 -
存在的问题
-
缓存更新失败,读到的是旧值
-
缓存更新前,短暂读到旧值
-
更新缓存,旧值覆盖新值
-
先删除缓存,再更新数据库
-
举例说明
线程A 线程B 线程C DB状态 Cache状态 说明 场景一 t0 100 100 初始值 t1 删除缓存 100 空 更新数据库 t2 查询缓存->空 100 空 更新缓存前查询到的是旧值 t3 查询数据库->100 100 空 多个线程同时查询数据库会导致缓存击穿 t4 写入缓存->100 100 100 t5 查询(缓存)->100 100 100 t6 更新数据库->200 200 100 数据库缓存不一致 t7 查询缓存->100 数据库缓存不一致 -
存在的问题
- 删除缓存后,如果大量请求同时查询数据库,导致缓存击穿
-
在删除缓存后,更新数据库前执行查询操作,会导致缓存存储旧值
先更新缓存,再更新数据库
-
举例说明
线程A 线程B 线程C DB状态 Cache状态 说明 场景一 t0 100 100 初始值 t1 更新缓存->200 100 200 更新缓存 t2 更新缓存->300 200 100 更新缓存前查询到的是旧值 t3 更新数据库->300 200 200 更新缓存 t4 更新数据库->200 t5 查询缓存->300 数据库缓存不一致 场景二 t0 100 100 初始值 t1 更新缓存->200 200 100 更新数据库 t2 更新数据库,更新失败 200 100 更新缓存,更新失败 t3 查询缓存->200 数据库缓存不一致 -
存在的问题
-
并发更新,导致数据库缓存不一致
-
数据库更新失败,导致数据库缓存不一致
-
参考资料
注意事项
- 部分内容由AI生成
- 如有不对,欢迎指正!!!
- 待优化