MySQL如何与Redis保持数据一致性?
redis的作用一般情况下Redis是用来实现应用和数据库之间的一个读操作的缓存层,主要目的是减少数据库的io , 还可以提升数据库io性能
方法一:先更新MySQL数据库,再删除缓存,再从数据库查询到的最新的数据同步到redis 。采用最终一致性性策略 。

文章插图
缺点:相较于mq的方式,这种方式由于要查数据库并将最新数据写到redis,可能会造成接口响应速度变慢 。
方法二:更新mysql数据库,再采用mq异步的方式,将数据同步到redis中 。

文章插图
缺点:数据同步延时概率比较大,数据库的更改信息投递到mq中,消费者可能没来得及消费消息同步数据到redis 。
优点:异步解耦
方法三:基于订阅mysql binlog,采用mq异步的形式将数据同步到redis(canal框架) 。

文章插图
将mysql以主从的方式部署,主库负责写 , 从库负责读,当主库的binlog日志文件发生改变时 , 将信息同步到从库,从库执行对应的sql , 保证主从一致性 。
canalServer端,伪装成mysql的从节点,订阅mysql主节点的binlog文件,当主节点的binlog发生变化时,会将binlog日志文件发送给canalServer端 , 自己创建的处理程序连接到canalServer端,将数据同步到redis 。
优点:手动直接更改数据库也会自动同步到redis 。
方法四:延时双删策略(不推荐)
- 先删缓存,在更新mysql并同步到redis,在高并发的情况下,第一个线程还没来得及更新mysql时,其他线程读取到的缓存可能为null值,将mysql旧的数据同步到redis中了 。
缺点:t1线程延时多少秒再去删除缓存中的key?难以控制,得根据业务逻辑的执行时间和写缓存的时间来进行估算 。

文章插图
补充:什么是双写一致性协议?
先更新数据库,在更新缓存 。
updateDB();updateredis();
多个线程同步修改mysql和redis时 , 由于mysql行锁机制,多个线程同时修改同一行数据,只能有一个线程修改成功,两个线程更新完数据库后同时更新redis,由于不能确保两个线程更新缓存的先后顺序,可能会造成数据库和缓存的不一致性 。解决办法:使用事务保证更新数据库和更新缓存整个两个操作的原子性 。
【MySQL如何与Redis保持数据一致性?】
推荐阅读
- C++11中auto关键字的深入理解与应用
- PostgreSQL vs MySQL - 1000万数据批量插入,谁能略胜一筹
- 如何在 Linux 下使用 WebP 图像
- 十分钟搞懂K8S的亲和与反亲和调度
- 掌握流量抑制与风暴控制,让你的业务更上一层楼
- 栈的实现:Python数据结构与算法
- 大瓜!刘涛被查?揭示娱乐圈背后的权力斗争与道德困境
- 陈好罕见与薛佳凝合照,前者嫁富豪依旧迷人,后者带佛珠皈依佛门
- 瞿颖,与三年前的油腻大妈,判若两人,52岁至今未婚
- 古代炒菜秘闻:烹饪器皿的独特魅力与古人美食智慧探究