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. 待优化
相关推荐
樱花落木兰33 分钟前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
ShineWinsu1 小时前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
海绵宝宝转agent3 小时前
基于Redis ZSet+AOP+注解实现限流注解算法
数据库·redis·算法
imDwAaY4 小时前
Redis 也能做消息队列?从 Stream 的存储讲到消费确认
数据库·redis·缓存
林伽一5 小时前
决策模型接口趋同、缓存按字节计价,AI 技术栈的两处底层改写| 2026年10月04日
人工智能·缓存
海绵宝宝转agent5 小时前
LeetCode100 LRU缓存思路讲解
java·开发语言·缓存
imDwAaY6 小时前
Redis 哈希表如何边扩容边服务?讲透渐进式 Rehash
redis·哈希算法·散列表
仍然.7 小时前
Redis---主从复制
java·数据库·redis
Flynt17 小时前
Redis Cluster主节点挂了,为什么"高可用"还全员掉线?我把三次kill的记录翻出来了
数据库·redis·分布式
写后端的胖头鱼19 小时前
一文详解Cache Aside(旁路缓存模式)
redis·缓存·延迟双删·缓存一致