首页 > 数据库 >MySQL和Redis更新一致性问题

MySQL和Redis更新一致性问题

时间:2024-07-10 14:56:00浏览次数:10  
标签:缓存 数据 数据库 Redis 更新 场景 MySQL 一致性 data

1. 先更新数据库,再更新缓存

适用场景:适用于对数据一致性要求不是特别高,且缓存更新失败对
系统影响较小的场景。例如,某些非关键数据的缓存更新。
风险:如果缓存更新失败,会导致数据库和缓存数据不一致。
// 更新数据库
updateMySQL(data);
// 更新缓存
updateRedis(data);

2. 先删除缓存,再更新数据库
这种方法可以减少数据不一致的时间窗口,但仍然存在问题。如果删除缓存后,更新数据库失败,会导致缓存中没有数据,而数据库中的数据是旧的。

适用场景:适用于对数据一致性有一定要求,且数据库更新失败对系
统影响较小的场景。例如,某些读多写少的缓存数据。
风险:如果数据库更新失败,会导致缓存中没有数据,而数据库中的
数据是旧的。
// 删除缓存
deleteRedis(key);
// 更新数据库
updateMySQL(data);

3. 先更新数据库,再删除缓存
这种方法可以减少数据不一致的时间窗口,但仍然存在问题。如果更新数据库后,删除缓存失败,会导致缓存中的数据是旧的。

适用场景:适用于对数据一致性有一定要求,且缓存删除失败对系统
影响较小的场景。例如,某些读多写少的缓存数据。
风险:如果缓存删除失败,会导致缓存中的数据是旧的。
// 更新数据库
updateMySQL(data);
// 删除缓存
deleteRedis(key);

4. 使用事务或分布式锁
通过使用事务或分布式锁,可以确保数据库和缓存的更新操作是原子的。
使用事务
在某些情况下,可以使用数据库事务来确保数据库和缓存的更新操作是原子的。

适用场景:适用于对数据一致性要求非常高,且需要确保数据库和缓
存更新操作的原子性的场景。例如,金融交易、订单处理等关键业务。
风险:使用事务或分布式锁会增加系统的复杂性和开销,可能会影响
系统的性能。
try {
    // 开始事务
    startTransaction();
    // 更新数据库
    updateMySQL(data);
    // 删除缓存
    deleteRedis(key);
    // 提交事务
    commitTransaction();
} catch (Exception e) {
    // 回滚事务
    rollbackTransaction();
}

使用分布式锁
通过使用分布式锁,可以确保在同一时间只有一个线程可以更新数据库和缓存。

// 获取分布式锁
if (acquireLock(lockKey)) {
    try {
        // 更新数据库
        updateMySQL(data);
        // 删除缓存
        deleteRedis(key);
    } finally {
        // 释放分布式锁
        releaseLock(lockKey);
    }
}

5. 使用消息队列
通过使用消息队列,可以将更新操作解耦,并确保更新操作的顺序性。

适用场景:适用于对数据一致性有一定要求,且需要解耦更新操作的
场景。例如,异步处理、批量更新等。
风险:消息队列可能会引入额外的延迟,且消息处理失败会导致数据
不一致。
// 发送更新消息到消息队列
sendMessageToQueue(updateMessage);

// 消费者处理消息
consumeMessageFromQueue(updateMessage) {
    // 更新数据库
    updateMySQL(data);
    // 删除缓存
    deleteRedis(key);
}

6. 使用缓存过期时间
通过设置缓存的过期时间,可以减少数据不一致的时间窗口。

适用场景:适用于对数据一致性要求不是特别高,且可以容忍一定时
间内数据不一致的场景。例如,某些非关键数据的缓存。
风险:缓存过期时间内,数据可能不一致。
// 更新数据库
updateMySQL(data);
// 删除缓存
deleteRedis(key);
// 设置缓存过期时间
setRedisExpiration(key, expirationTime);

标签:缓存,数据,数据库,Redis,更新,场景,MySQL,一致性,data
From: https://blog.csdn.net/weixin_43076660/article/details/140324018

相关文章

  • MySQL中datetime和timestamp的区别
    #MySQL中datetime和timestamp的区别相同点两个数据类型存储时间的格式一致。均为YYYY-MM-DDHH:MM:SS两个数据类型都包含「日期」和「时间」部分。两个数据类型都可以存储微秒的小数秒(秒后6位小数秒)自动更新和默认值TIMESTAMP:支持默认值为当前时间,且在记录更新时可以......
  • mysql数据库中毒恢复
    一、立即隔离受感染的系统断开网络连接:首先,立即断开受感染系统的网络连接,以防止病毒进一步传播或黑客获取更多敏感信息。隔离受感染设备:将受感染的计算机或服务器从网络中隔离出来,以避免对其他系统造成影响。二、评估损害范围检查日志文件:查看系统日志和MySQL日志文件,了解病毒......
  • 《基于 LatentFactor + Redis + ES 实现动态药房分配方法》
    ......
  • 在命令行中连接mysql
    1.在mysql官网下载mysql软件,下载界面:https://dev.mysql.com/downloads/installer/ 选择合适的版本,进行下载2.在安装完成mysql后,在命令行输入mysql会提示不是内部外部命令,此时需要对mysql的系统变量进行配置:3.配置系统变量:第一步,右键“我的电脑”,选择“属性”-“高级系统......
  • 阿里云普罗米修斯接入mysql监控
    打开https://arms.console.aliyun.com/?spm=5176.12818093_-1363046575.ProductAndResource--ali--widget-product-recent.8.5cfe16d07QgyJq#/home     点击后,就会进入这里就是你的mysql服务器监控数据了 ......
  • Rocky Linux 9.4安装MySQL:使用RPM安装包方式
    RockyLinux9.4安装MySQL:使用RPM安装包方式一、安装环境安装环境如下:服务器:RockyLinux9.4安装版本:MySQL8.0.38二、安装过程和细节1、在官网下载RPM安装包官网下载地址如下,这个地址里有各个版本的安装包,根据自己的版本选择,下载对应系统的安装包https://dev.mysql.com/dow......
  • MySQL导入数据库报错#1118 - Row size too large ( 8126). 的解决方法
    导入SQL文件时报错(在执行创建表或者增加字段时,发现rowsize长度过长,会导致出现以下错误)[ERR]1118-Rowsizetoolarge(>8126).ChangingsomecolumnstoTEXTorBLOBorusingROW_FORMAT=DYNAMICorROW_FORMAT=COMPRESSEDmayhelp.Incurrentrowformat,BLOBprefix......
  • redis:常用客户端命令(redis-cli)
    一,查看redis所有配置使用命令:CONFIGGET*例:127.0.0.1:6379>CONFIGGET*1)"cluster-announce-bus-port"2)"0"3)"syslog-ident"4)"redis"5)"enable-module-command"6)"no"7)"mi......
  • idea springboot 如何支持数据库配置 redis配置 支持不同环境(uat验证环境、测试环境)切
    在SpringBoot中,可以通过配置文件来支持数据库和Redis的配置,并支持不同环境的切换。以下是一些常用的方法:创建配置文件:在src/main/resources目录下创建以下配置文件:application.properties:通用配置文件application-uat.properties:uat验证环境配置文件application-test.prope......
  • MySQL查询
    2024.7.91.在查询的时候,如果要select一个临时表再次用于查询,要给它起别名2.各个关键字正确的执行顺序如下先找到要查询表格或连接要查询的表格,因此FROM才是第一步;接下来是进行条件筛选,所以是WHERE紧随其后;然后如果遇到表格有分组的需要,则需要先GROUPBY;分组时如果也......