redis缓存双写

redis缓存双写

文档

  1. redis单机安装
  2. redis集群模式 -集群搭建
  3. redis大key问题-生成大key-生成100万条测试数据

官方文档

  1. 官网操作命令指南页面:https://redis.io/docs/latest/commands/?name=get&group=string
  2. Redis cluster specification

下载地址

  1. 官网:https://redis.io/
  2. 下载列表页面:https://download.redis.io/releases/

说明

  1. 版本选择:redis-7.0.0.tar.gz
  2. 下载地址:https://download.redis.io/releases/redis-7.0.0.tar.gz

redis缓存双写

安装redis
  1. 以单机版redis为例,安装redis参考文档:redis单机安装
什么是缓存双写
  1. 缓存双写是一种缓存更新策略,在数据更新时同时更新数据库和缓存,确保两者数据一致性
为什么缓存双写会存在一致性问题
  1. 数据库和缓存是两个独立的存储系统,无法保证更新操作的原子性;当一个操作成功而另一个失败时,或在并发场景下操作顺序不可控时,就会导致数据不一致。
缓存双写常见的模式及存在的问题
先更新数据库,再删除缓存(推荐)
  1. 举例说明

    线程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 一致
  2. 存在的问题

    1. 缓存删除失败,读到的是旧值

    2. 缓存删除前,短暂读到旧值

    3. 删除缓存后,大量请求同时查询数据库,导致缓存击穿

先更新数据库,再更新缓存
  1. 举例说明

    线程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 数据库、缓存不一致
  2. 存在的问题

    1. 缓存更新失败,读到的是旧值

    2. 缓存更新前,短暂读到旧值

    3. 更新缓存,旧值覆盖新值

先删除缓存,再更新数据库
  1. 举例说明

    线程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 数据库缓存不一致
  2. 存在的问题

    1. 删除缓存后,如果大量请求同时查询数据库,导致缓存击穿
  3. 在删除缓存后,更新数据库前执行查询操作,会导致缓存存储旧值

先更新缓存,再更新数据库
  1. 举例说明

    线程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 数据库缓存不一致
  2. 存在的问题

    1. 并发更新,导致数据库缓存不一致

    2. 数据库更新失败,导致数据库缓存不一致

参考资料

  1. https://www.bilibili.com/video/BV13R4y1v7sP

注意事项

  1. 部分内容由AI生成
  2. 如有不对,欢迎指正!!!
  3. 待优化
相关推荐
前端程序猿之路3 小时前
AI大模型应用之-RAG 全流程
人工智能·python·gpt·语言模型·aigc·mybatis·ai编程
Gogo8163 小时前
Redis定时任务
redis·定时任务
工藤学编程3 小时前
AI Ping 赋能:基于 GLM-4.7(免费!)+ LangChain + Redis 打造智能AI聊天助手
人工智能·redis·langchain
MoonBit月兔4 小时前
海外开发者实践分享:用 MoonBit 开发 SQLC 插件(其三)
java·开发语言·数据库·redis·rust·编程·moonbit
灵感菇_4 小时前
Android图片加载框架 Glide全面解析
android·缓存·glide
程序员miki4 小时前
Redis核心命令以及技术方案参考文档(分布式锁,缓存业务逻辑)
redis·分布式·python·缓存
@淡 定4 小时前
缓存原理详解
java·spring·缓存
gjc5924 小时前
内存中的 Buffer(缓冲区)和 Cache(缓存)区别
缓存
云技纵横5 小时前
本地限流与 Redis 分布式限流的无缝切换 技术栈:Sentinel 线程池隔离 + Nginx + Kafka
redis·分布式·sentinel