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. 待优化
相关推荐
一直都在57242 分钟前
Redis(二)
数据库·redis·缓存
得物技术1 小时前
Redis 自动化运维最佳实践|得物技术
大数据·redis
爱丽_2 小时前
Redis 分布式锁:SET NX、过期时间、续租、可重入、Redlock 与坑
数据库·redis·分布式
PacosonSWJTU3 小时前
(转)mybatis拦截器
数据库·redis·mybatis
曲幽3 小时前
FastAPI + Celery 实战:异步任务的坑与解法,我帮你踩了一遍
redis·python·fastapi·web·async·celery·background·task·queue
I'm Jie4 小时前
FastAPI 集成 Redis 开发手册
redis·fastapi
Zaki_gd4 小时前
Cortex-M7 D-Cache 与 DMA 缓存一致性说明
java·spring·缓存
keyborad pianist4 小时前
一篇文章学会Redis
数据库·redis·缓存
ok_hahaha4 小时前
java从头开始-黑马点评-分布式锁-redis实现基础版
java·redis·分布式
敢敢のwings5 小时前
智元 D1 强化学习sim-to-real系列 | Robot Lab 基于 Isaac Lab 的机器人强化学习使用(四)
数据库·redis·机器人