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(可以聊天聊地的那种)

你可能感兴趣的:(mysql)