如何保证Redis和MySQL数据的一致性解析

1、常见的缓存更新策略:

定义:主要用来进行redis和mysql的数据同步更新的一些策略
请添加图片描述

  1. 内存淘汰:等触发淘汰机制后,刚好淘汰到了用户查询的数据,此时是null,会进行查询数据库并写入到缓存中,此时查询到的数据就是新的,但如果淘汰掉的不是用户查询的数据,每次用户都能够查询到数据,其实这个数据也就是旧数据,数据一致性较差。
  2. 超时剔除:和内存淘汰策略差不多
  3. 主动更新(主要应用策略):由程序员进行编码,在数据库进行更新时候手动更新缓存

2、主动更新策略:

在这里插入图片描述

3、主动更新第一个策略(CAP)

3.1 定义原理
由缓存的调用者在进行更新数据库的同时更新缓存
在这里插入图片描述
更新数据: 在进行数据库数据修改的时候,一般都是删除缓存,然后缓存为空,等待查询时候判空再进行数据库的查询然后更新缓存,而不是每次去做更新数据都进行更新缓存操作。

3.2、先操作缓存还是先数据库?
在这里插入图片描述

  • 先删缓存、后更新数据库(弊端较大): 假设一个线程删除了缓存,然后进行更新数据库,此时另外一个线程进行数据的查询,因为数据库操作比缓存操作慢,此时因为缓存未命中重新写入缓存,但是数据库还没更新完毕,此时获取到的数据仍是旧数据。
  • 先更新数据库、后删除缓存: 出现并发问题情况几乎没有,可能出现的问题就是刚好查询缓存时候,缓存失效,然后另外一个线程进行数据库更新,此时第一个线程已经将旧的数据重新写入缓存了。获取到的仍然是旧数据,但是发生的几率较低。
  • 双写一致性(延迟双删)
    • 流程:
      更新数据库
      删除 Redis 缓存
      短暂延迟(如 500ms)后,再次删除缓存
    • 目的:避免并发情况下 旧数据回写 Redis 的问题。
  • 使用消息队列确保一致性: 数据库更新后,发送消息消费消息,删除 Redis,确保 Redis 最终一致。
### 如何保证 Redis MySQL 数据一致性 #### 方法一:最终一致性设计 为了实现 Redis MySQL 之间的数据一致性,通常采用 **最终一致性** 的设计理念。由于 Redis 是内存数据库MySQL 是关系型数据库,两者在性能持久化能力上存在差异,因此难以直接达到强一致性[^1]。然而,通过合理的架构设计技术手段,可以在一定程度上接近最终一致性。 #### 方法二:双写机制 一种常见的做法是使用 **双写模式**,即应用程序同时向 Redis MySQL 写入数据。这种方式的关键在于确保两个系统的操作顺序一致,并处理可能发生的异常情况。如果某个阶段失败,则需要回滚或者补偿逻辑来修复不一致状态[^2]。 ```python def dual_write(key, value): try: redis.set(key, value) # 向Redis写入数据 mysql.execute(f"INSERT INTO table (key, value) VALUES ('{key}', '{value}')") # 同步到MySQL except Exception as e: handle_exception(e) # 处理错误并尝试恢复一致性 ``` #### 方法三:基于消息队列的异步同步 另一种有效的方法是利用 **消息队列** 实现异步同步。当业务层完成对 MySQL 的修改后,将变更事件发送至消息队列;消费者订阅该队列并将对应的变化应用到 Redis 上。这种方法降低了系统间的耦合度,同时也缓解了高并发场景下的压力[^3]。 ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() def send_to_queue(message): channel.basic_publish(exchange='', routing_key='sync', body=message) send_to_queue(json.dumps({"action": "update", "data": {"key": key, "value": value}})) ``` #### 方法四:Canal 中间件方案 对于某些特定需求而言,还可以借助第三方工具如 Canal 来简化开发工作量。它能够模拟成为 MySQL 的从节点连接主库获取增量 binlog 日志解析提取 DML/DDL 变更记录再转发给下游目标存储比如 Redis 完成实时更新过程。 --- ### 总结 综上所述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的小熊猫_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值