Redis双写一致性

文章目录

  • Redis双写一致性
  • [1. 延迟双删(有脏数据风险)](#1. 延迟双删(有脏数据风险))
  • [2. 异步通知(保证数据最终一致性)](#2. 异步通知(保证数据最终一致性))
  • [3. 分布式锁(数据的强一致,性能低)](#3. 分布式锁(数据的强一致,性能低))

Redis双写一致性

当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。

1. 延迟双删(有脏数据风险)

  1. 先删缓存,还是先删数据库?
    无论先删缓存还是先删数据库,在多线程情况下都可能导致缓存脏数据的可能。
  2. 延迟双删(有脏数据风险)
  • 读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间
  • 写操作:延迟双删
    删除两次缓存,是为了减少缓存脏数据的可能性
    存在的问题:延迟的时间不好控制

2. 异步通知(保证数据最终一致性)

  • 基于MQ异步通知
  • 基于Canal异步通知

二进制日志(BINLOG)记录了所有DDL语句和DML语句,但不包括数据查询(select,show)语句

3. 分布式锁(数据的强一致,性能低)

读多写少 情况下可以使用分布式锁,能保证数据的强一致性,但是性能比较低

实现:

共享锁:读锁readLock,加锁之后,其他线程可以共享读操作(用在查询数据方法里面)

排他锁:独占锁writeLock,加锁之后,阻塞其他线程读写操作(用在更新数据方法里面)

使用Redisson来实现,对同一把锁分别使用readLock,writeLock。

java 复制代码
RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("ITEM_READ_WRITE_LOCK");
//在更新数据的方法里面使用writeLock
readWriteLock.writeLock();
//在查询的方法使用readLock
readWriteLock.readLock();
相关推荐
小马爱打代码2 分钟前
框架 - 组件 - 中间件:生产级参数配置指引
数据库·中间件
asdfg125896319 分钟前
一文通俗理解JDBC中的核心概念+案例
java·数据库·oracle·jdbc
点灯小铭26 分钟前
基于单片机与DAC0832的双路波形信号发生系统设计
数据库·单片机·mongodb·毕业设计·课程设计·期末大作业
小陈phd32 分钟前
Text2SQL智能体学习笔记(二)——NL2SQL落地的隐形基石:元数据库
数据库·笔记·学习
霸道流氓气质33 分钟前
阿里云 OSS 从零到实战:概念、配置与 Spring Boot 集成指南
数据库·spring boot·阿里云
茉莉玫瑰花茶34 分钟前
综合案例 - AI 智能租房助手 [ 4 ]
数据库·python·ai·langgraph
ULIi096kr36 分钟前
MySQL查看表创建时间、修改时间、最后更新时间(精准排查僵尸表)
数据库·mysql
折哥的程序人生 · 物流技术专研1 小时前
Tomcat 严重警告:JDBC 驱动未注销 + 工作线程泄漏 —— 原因、影响与彻底修复(生产级终极指南)
java·运维·数据库·mysql·oracle·tomcat
初圣魔门首席弟子1 小时前
Qt C++ 项目实战:修改共享头文件后的高效增量编译与快速发布流程
数据库
wb043072011 小时前
仓库搬家不停业——从阿明的“在线换仓库“,看数据库迁移与 Schema 演进的实战方法论
数据库·adb·架构