掘地三尺搞定Redis与MySQL数据一致性问题(9)
2023-04-24 来源:飞速影视
读请求可能出现少量读取旧数据的情况,但是很快旧数据就会被删除,之后的请求都能获取最新数据,问题不大。
还有一种比较极端的情况,缓存自动失效的时候又遇到了高并发读写的情况,假设这会有两个请求,一个线程 A 做查询操作,一个线程 B 做更新操作,那么会有如下情形产生:
![掘地三尺搞定Redis与MySQL数据一致性问题](http://fs.qqfile.top/re/aHR0cHM6Ly9waWMucm1iLmJkc3RhdGljLmNvbS9iamgvZG93bi9jYzYzZTBmMTE5NzUyM2I5YWYyZTcyZGMwMjk3NWI1YS5qcGVnQHdtXzIsdF81NW0gNWE2MjVZIDNMMGxVVUZWQyxmY19mZmZmZmYsZmZfVTJsdFNHVnAsc3pfMjIseF8xNCx5XzE00)
缓存忽然失效
缓存的过期时间到期,缓存失效。线程 A 读请求读取缓存,没命中,则查询数据库得到一个旧的值(因为 B 会写新值,相对而言就是旧的值了),准备把数据写到缓存时发送网络问题卡顿了。线程 B 执行写操作,将新值写数据库。线程 B 执行删除缓存。线程 A 继续,从卡顿中醒来,把查询到的旧值写到入缓存。
码哥,这咋玩,还是出现了不一致的情况啊。
不要慌,发生这个情况的概率微乎其微,发生上述情况的必要条件是:
步骤 (3)的写数据库操作要比步骤(2)读操作耗时短速度快,才可能使得步骤(4)先于步骤(5)。缓存刚好到达过期时限。
通常 MySQL 单机的 QPS 大概 5K 左右,而 TPS 大概 1k 左右,(ps:Tomcat 的 QPS 4K 左右,TPS = 1k 左右)。
数据库读操作是远快于写操作的(正是因为如此,才做读写分离),所以步骤(3)要比步骤(2)更快这个情景很难出现,同时还要配合缓存刚好失效。
所以,在用旁路缓存策略的时候,对于写操作推荐使用:先更新数据库,再删除缓存。
4. 一致性解决方案有哪些?
最后,针对 Cache-Aside (旁路缓存) 策略,写操作使用先更新数据库,再删除缓存的情况下,我们来分析下数据一致性解决方案都有哪些?
4.1 缓存延时双删
如果采用先删除缓存,再更新数据库如何避免出现脏数据?
采用延时双删策略。
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号