MySql与Redis的数据同步

(一)延时双删

  • 第一次删除:当数据库中的数据需要更新时,首先会删除缓存中的对应数据。这是为了防止后续的读取操作获取到旧的缓存数据,导致数据不一致。例如,数据库中有一个用户信息表,缓存中存储了用户的基本信息。当用户修改了自己的手机号码后,系统会先将缓存中该用户的信息删除。
  • 延迟及第二次删除:由于数据库的更新操作可能是一个复杂的过程,存在一定的时间差,在这个时间差内可能会有其他操作尝试读取缓存(因为缓存删除操作可能还没完全生效),导致缓存又被重新写入旧的数据。为了避免这种情况,在第一次删除缓存后,系统会等待一段时间(这个时间是经过预估的,通常是根据系统的负载、数据库操作的平均时长等因素来确定),然后再次检查并删除缓存。这样可以确保缓存中的数据与数据库中的最新数据保持一致。

适用于:延时的时间不好确定,在延时的过程中,可能会出现脏数据,并不能保证强一致性。适于对时效性要求不高的数据。

(二)读写锁

  • 读模式(共享模式)
    • 当一个线程以读模式获取读写锁时,只要没有线程以写模式持有该锁,其他线程也可以以读模式获取这个锁。这是因为多个线程同时读取共享资源通常是安全的,不会导致数据不一致。例如,在一个多线程的文件读取系统中,多个线程可以同时获取读写锁的读模式来读取文件内容,它们不会相互干扰。
  • 写模式(独占模式)
    • 当一个线程以写模式获取读写锁时,它独占这个锁。这意味着在该线程完成写入操作并释放锁之前,其他任何线程(无论是读模式还是写模式)都不能获取这个锁。例如,当一个线程要修改文件内容时,它以写模式获取读写锁,此时其他线程不能读取或修改这个文件,直到写操作完成。

使用Redisson实现读写锁。在读的时候添加共享锁,可以保证读读不互斥、读写互斥。当更新数据的时候,添加排他锁。它是读写、读读都互斥,这样就能保证在写数据的同时,是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是,读方法和写方法上需要使用同一把锁才行。

适用于:对时效性要求高的数据。

(三)中间件canal

  1. Canal 组件简介
    • Canal 是阿里巴巴开源的一款基于 MySQL 数据库增量日志解析的组件。它主要用于数据的同步、备份和数据变更的监控等场景。
  2. 伪装成 MySQL 从节点的原理
    • MySQL 主从复制机制背景:在 MySQL 的主从复制架构中,主节点(Master)会将数据库的变更操作记录到二进制日志(Binlog)中。从节点(Slave)通过读取主节点的 Binlog,并在本地重放这些操作,从而实现数据的同步。
    • Canal 的工作方式:Canal 模拟了 MySQL 从节点的行为。它通过网络连接到 MySQL 服务器,以从节点的身份请求并接收 Binlog 数据。这样,Canal 就能够获取到 MySQL 主数据库的所有数据变更信息,而不需要对业务代码进行修改,因为它是在数据库层面进行数据捕获的。
  3. Binlog 数据读取和利用
    • Binlog 的作用:Binlog 是 MySQL 数据库用于记录所有更改数据的 SQL 语句或数据行变更的日志文件。例如,当执行一条插入、更新或删除语句时,这些操作都会被记录到 Binlog 中。
    • Canal 对 Binlog 的解析:Canal 会实时读取 Binlog 中的数据,然后对其进行解析。它能够理解 Binlog 中的各种事件类型,如事务的开始、提交,以及具体的插入、更新、删除操作对应的记录等。通过解析 Binlog,Canal 可以获取到数据变更的详细内容,包括表名、列名和变更后的值等信息。
  4. Canal 客户端更新缓存的过程
    • Canal 客户端的作用:Canal 客户端是与 Canal 服务进行通信的程序部分。它会订阅 Canal 服务解析出来的 Binlog 数据变更事件。
    • 更新缓存的操作:当 Canal 客户端接收到数据变更事件后,例如收到一个用户表中某用户信息更新的事件,它会根据事件中的信息,如更新后的用户 ID、姓名、年龄等内容,构造相应的操作来更新缓存。如果是缓存系统(如 Redis),可能会根据用户 ID 作为键,更新对应的用户信息缓存值,从而确保缓存中的数据与 MySQL 数据库中的最新数据保持一致。这种方式有效地实现了数据在数据库和缓存之间的同步,并且对业务代码是透明的,即业务代码在进行数据库操作时,不需要额外关注缓存更新的具体过程,Canal 组件会自动完成这一数据同步工作。

总结:采用阿里的Canal组件实现数据同步:不需要更改业务代码,只需部署一个Canal服务。Canal服务把自己伪装成mysql的一个从节点。当mysql数据更新以后,Canal会读取binlog数据,然后再通过Canal的客户端获取到数据,并更新缓存即可。

适用于:可以接受有一定延时的业务(性能和时效性居中)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值