除了用canal实现mysql数据与redis同步还有其他方法吗

  1. 设置一个mysql监听器,当客户端向mysql写入数据时,触发器被触发,触发后自动调用mysql的UDF函数,UDF函数可以做到将数据同步到redis中 (因为mysql触发器本身就会造成效率降低,该方法只适合读多写少的操作)
  2. 搭建一个mysql数据库设定为要同步的数据库的从机,获取binlog日志,从而第一时间获取主机的改变,并同步到redis中

canal在项目中的作用:

  1. 监听广告表,广告有变化后立刻将变化同步到redis数据库
  2. 监听商品表,商品信息有变化,或者有新商品审核通过时,更新或生成商品详情页

canal工作原理:

image.png
模仿mysql主从复制

  1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
  2. mysql master收到dump请求,开始推送binary log给slave(也就是canal)
  3. canal解析binary log对象(原始为byte流),从而获取mysql更新的数据

    mysql主从复制流程

    mysql主从复制,是将主数据库中的DDL(数据定义)和DML(数据操作)操作通过二进制日志传输到从数据库上,然后将这些日志重新执行,从而使得从数据库与主数据库保持一致。
    当从服务器链接主服务器时,它通知主服务器找到从服务器最后一次成功更新的位置,从服务器接收这一位置之后的所有的操作binlog日志,并在本机上执行相同的更新,然后封锁并等待主服务器通知新的更新。

主要涉及三个线程:

  1. binlog线程:负责将主服务器上的数据更改写入二进制日志当中
  2. I/O线程:负责从主服务器上读取二进制日志,并写入从服务器的重放日志(Relay log)中。
  3. SQL线程:读取重放日志并运行其中的sql语句