Redis缓存和数据库一致性解决策略

2,603 阅读2分钟

一、 实时同步

  • 要求强一致性
  • 先查询缓,若存查询不到,再查DB,然后保存到缓存
  • 更新缓存时,先更新数据库,再将缓存的设置过期(建议不要去更新缓存内容,直接设置缓存过期)

二、 异步队列

简介

对于并发程度较高的,可采用异步队列的方式同步数据,可采用kafka、RicketMQ等消息中间件处理消息生产和消费

kafka优点

  1. 数据放在了硬盘上,对硬盘进行了顺序IO流存址,所以读取效率高

kafka作用

  1. 异步数据同步
  2. 流量削峰:如同时给1W人打款,服务器压力大,可进行异步操作,设置异步队列,然后定时,在服务器空闲的时候一个一个进行打款操作
  3. 数据放在硬盘上,而不是内存中,保证消息队列的数据不丢失

三、 阿里的同步工具canal

简介

canal实现方式是模拟mysql slave和master的同步机制,监控DB bitlog的日志更新来触发缓存的更新,此种方法可以解放程序员双手,减少工作量,但在使用时有些局限性。

Mysql主从复制原理简析

  • 该模型有两种服务器:例如,master服务器专门用于数据的增删改,slave服务器(1个或多个)专门用于数据查询
  • 如何保证两种服务器数据的一致性?
    1. master服务器将操作中的改变记录存放到二进制日志文件中(binary log),这些记录叫做二进制日志事件(binary log events),我们可以通过show binlog events命令进行查看。
    2. Slave服务器会通过IO线程去读取binary log文件中信息并复制到自己的relay log(中继日志)日志文件中。
    3. Slave服务器在通过开启SQL线程定时读取检查relay log,一旦发现有修改,就立即重新加载relay log文件中的信息,然后执行文件中的修改记录,并反映到自己的服务器中。

canal原理简析

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

四、 用UDF自定义函数的方式

面对mysql的API进行编程,利用触发器进行缓存同步,但UDF主要是c/c++语言实现,学习成本高。


PS:

  1. 文章来自各种资源的整理,如有侵权请告知删除。
  2. 转载本文请注明出处