Redis(Remote Dictionary Server)的使用(3) | 青训营笔记

88 阅读2分钟

Redis(Remote Dictionary Server)的使用(3) | 青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

Redis缓存与数据库同步方案

在做青训营的后端项目时,我们采用Redis对点赞/取消赞和关注/取关操作进行缓存,按照一定策略使键过期,并定时同步数据到数据库。该方案目前存在着一定问题,若 Redis 与 MySQL 同步时仍有请求进入,则会丢弃后面请求的数据。因此本文想总结分析一下目前的一些Redis与数据库同步的方案。

方案1:UDF实现:

通过MySQL自动同步刷新Redis。当用户对MySQL数据库进行数据操作的同时,即将相应的数据同步到Redis中,此时同步到Redis中的数据,其查询操作就在Redis中完成。

具体实现过程:

  • 在数据库中对可操作的数据设置触发器Trigger以实现数据监听
  • 当客户端向服务器发送请求时,NodeServer向MySQL中写入数据,此时触发器被触发,Sync随即调用MySQL的UDF函数
  • UDF将数据写入Redis缓存,完成数据库与Redis的同步

使用场景:

  • 适用于写操作较少的场景,并且要求不存在并发写的场景

问题分析:

  • MySQL的触发器本身存在着性能瓶颈,会造成数据操作效率较低的问题,对于操作频繁的情况,大量设置触发器显然是不可取的

方案2:binlog实现:

利用MySQL数据库的复制原理,即:设置主从服务器,主服务器操作数据并写入Bin log,从服务器会自动调用I/O线程读取该Bin log,并且写入到自己的Relay log中,再调用SQL线程从Relay log中解析数据,从而同步到自己的数据库中。

在本方案中,设置MySQL为主服务器,Redis为从服务器。如果MySQL中有数据写入Bin log,Sync就自动解析MySQL的Bin log,然后将解析出来的数据写入到Redis中,从而达到同步的效果。

问题分析: MySQL的Bin Log存在Statement/Row/Mixedlevel多种形式,要实现Sync对Bin Log的解析是相对困难的,而且工作量较大,同步操作就需要一定时间,此时就很可能出现Redis 与 MySQL 同步时仍有请求进入难以及时处理的情况。