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. 待优化
相关推荐
Lucis__2 小时前
Redis持久化机制解析
redis·缓存·操作系统·文件·非关系型数据库·1024程序员节
李纲明3 小时前
WordPress 后台登录马上被踢回登录页:Cookie 域、HTTPS、盐值和页面缓存怎么查
运维·缓存·https·php·wordpress·cookie
paopaokaka_luck3 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
用户094248568035 小时前
第7章:Redis有序集合 ZSet 实战:排行榜与延时任务
redis·架构·源码
码士集团小青6 小时前
面霸篇:高频 Java 基础问题(核心卷一)
linux·服务器·数据库·redis·缓存·1024程序员节
2301_32241428046 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
乐茵lin6 小时前
Redis 持久化机制详解:RDB 与 AOF
redis·bootstrap·mybatis
一条泥憨鱼7 小时前
【Redis | 黑马点评】附近商铺功能源码解读
数据库·redis·缓存
舰长1158 小时前
将百万数据插入到 Redis,有哪些实现方案?
数据结构·redis·开源
bksczm10 小时前
Redis数据结构之hash
数据结构·redis·哈希算法·1024程序员节