Redis与数据库数据同步解决方案

Dcr 1年前 ⋅ 1015 阅读

数据库同步到redis

  • 方案一: 读:读redis,没有读db,并将db的值回写到redis 写:写db,成功后update或者失效掉缓存redis中的值(这里需要考虑如果db成功后更新redis失败了怎么处理,一般情况下设置好一个合理的过期时间,这样即使更新失败了,等到缓存过期了也可以通过回写更新;还有一种更好的方法是在db_commit_before之前将缓存置为失效) 对于一致性要求高的,从db读,比如金融,交易数据.其他的从redis读. 这种方案的好处是由db保证持久化一致性等.不容易出错.
  • 方案二: 以mysql为例子,基于binlog使用mysql_udf_redis,将数据库中的数据同步到redis. 但是这将整体的复杂性提高了,而且系统的整个边界也扩大了,变得更加不稳定也不好管理了.

Canal开源技术

阿里巴巴旗下的一款开源项目,纯java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持mysql. 工作原理(模仿Mysql复制):

  • canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql mater发送dump协议
  • mysql master 收到dump请求,开始推送binary log给slave(也就是canal)
  • canal解析binary log对象(原始为byte流)

redis同步到数据库

也就是说将redis中的数据变化同步到db 这样做的好处减小了db的压力,但是redis作为临时数据库,状态很不稳定 虽然redis也有持久化机制,但是redis集群宕机后的重启,数据加热都很耗时. 另一方面,随着大量数据插入或者更新导致redis持久化操作会严重拖累作为内存kV数据库的优势.

  • 方案一: 将redis变更复制一份,放到队列中,给db消费. 但是这个方案只能保证最终一致性,而且增加了变更数据和队列维护的复杂度. redis 本身也有类似的机制pipeline通知机制,但是不保证一定能通知到.

全部评论: 0

    我有话说: