redis 落地mysql_mysql和redis的数据一致性

mysql是如今非常主流的的关系型数据库,尤其是其InnoDB的存储引擎,在索引,事务,数据备份和恢复等方面有巨大的优势,因此也成了企业及个人开发者经常使用的存储方式。redis是与之相对的非关系型数据库的代表(Nosql, not only sql),其支持大量连接,数据存储在内存带来的执行速度快的优势,已经数据持久化保证数据不丢失等特性使得很多应用用其做为缓存。

当服务使用了mysql做数据落地和redis做数据缓存,由于两者存在延迟,势必造成数据的不一致性,下面来看一下可能出现的case以及解决方案。

情景1,数据先落地redis,然后同步到mysql, 这样就存在数据删除的时候,还没同步到mysql,这时另一个请求来查询数据,查询redis不存在,去mysql取数据,取到数据并更新到redis,这样就出现了数据不一致。

情景2,数据先落地mysql,然后同步到mysql,这样就可能出现删除数据,同步到redis出现线程死掉的情况,这时redis没有完成同步删掉数据,查询的时候命中缓存,出现数据不一致。

基于此,可以想到的解决方案如下

1,基于情景1,数据分情况处理,对于实时性要求高的直接穿透到mysql,不使用redis进行缓存,直接操作mysql,对于实时性要求不高的依旧可以选择redis缓存,然后mysql落地的方案。

2,基于情景1,如果不能接受方案1,可以对数据更新进行程序内延迟双删处理,删除数据时,先删除key,同步到mysql返回之后,再执行一次删除,同时配合缓存超时来保证数据的一致性

3,基于情景2,可以使用异步更新缓存的机制,基于mysql的binlog同步更新redis(阿里的开源框架canal),热数据可以同步到redis,减轻MySQL的压力,更新操作直接操作MySQL。redis数据更新通过binlog来增量同步,类似mysql的主从同步。

以上

欢迎加QQ群:994625692(可以聊天聊地的那种)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值