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. 待优化
相关推荐
Simon5231410 小时前
MyBatis三大核心文件:Entity、DAO、Mapper
mybatis
柿柿快乐10 小时前
Redis 入门第一课:全局命令、内部编码与单线程模型
redis·学习·缓存·基础教学
磊 子10 小时前
1.4CPU缓存一致性
java·spring cloud·缓存·系统
Tirzano12 小时前
超大型组和用户缓存redis
redis·缓存·哈希算法
阿维的博客日记12 小时前
zset实现延迟队列
redis·zset
无小道13 小时前
Redis——string类型相关指令
redis·指令·string
MandalaO_O13 小时前
MyBatis:核心概念 + 环境搭建 + CRUD
java·tomcat·mybatis
码云骑士14 小时前
Redis 入门实战:从 NoSQL 概念到安装与基础操作详解(一)
数据库·redis·缓存
XS03010615 小时前
MyBatis基础实战笔记一
笔记·mybatis
噢,我明白了16 小时前
MyBatis-Plus的引入和配置
java·tomcat·mybatis