掘地三尺搞定Redis与MySQL数据一致性问题(10)
2023-04-24 来源:飞速影视
先删除缓存。写数据库。休眠 500 毫秒,再删除缓存。
这样子最多只会出现 500 毫秒的脏数据读取时间。关键是这个休眠时间怎么确定呢?
延迟时间的目的就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据。
所以我们需要自行评估项目的读数据业务逻辑的耗时,在读耗时的基础上加几百毫秒作为延迟时间即可。
4.2 删除缓存重试机制
缓存删除失败怎么办?比如延迟双删的第二次删除失败,那岂不是无法删除脏数据。
使用重试机制,保证删除缓存成功。
比如重试三次,三次都失败则记录日志到数据库并发送警告让人工介入。
在高并发的场景下,重试最好使用异步方式,比如发送消息到 mq 中间件,实现异步解耦。
![掘地三尺搞定Redis与MySQL数据一致性问题](http://fs.qqfile.top/re/aHR0cHM6Ly9waWMucm1iLmJkc3RhdGljLmNvbS9iamgvZG93bi83MzQ1Yjg0MzE0YTI4ZDA5NjA2Mzc2YjZhZDk0ZGFjNi5wbmdAd21fMix0XzU1bSA1YTYyNVkgM0wwbFVVRlZDLGZjX2ZmZmZmZixmZl9VMmx0U0dWcCxzel8yMix4XzE0LHlfMTQ1)
重试机制
第(5)步如果删除失败且未达到重试最大次数则将消息重新入队,直到删除成功,否则就记录到数据库,人工介入。
该方案有个缺点,就是对业务代码中造成侵入,于是就有了下一个方案,启动一个专门订阅 数据库 binlog 的服务读取需要删除的数据进行缓存删除操作。
4.3 读取 binlog 异步删除
![掘地三尺搞定Redis与MySQL数据一致性问题](/images/loading.gif)
binlog异步删除
更新数据库;数据库会把操作信息记录在 binlog 日志中;使用 canal 订阅 binlog 日志获取目标数据和 key;缓存删除系统获取 canal 的数据,解析目标 key,尝试删除缓存。如果删除失败则将消息发送到消息队列;缓存删除系统重新从消息队列获取数据,再次执行删除操作。
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号