电商系统高并发场景中的缓存 DB 数据一致性问题!

JAVA herman 599浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

电商系统中存在非常多的高并发场景,而高并发场景又存在非常多的缓存 DB 等数据一致性问题。这些问题具体是怎么造成的,今天我们一起来看图说话!

对应高并发系统,系统的压力一般都在后端的 DB 中。大量的并发写、并发读,给 DB 带来非常大的压力。一不小心就会产生崩溃,导致整个系统不可用。当然,实际生产中我们肯定有其他的策略来保证服务的可用性、可靠性。高可用是我们的第一要素,第一要求。

安全是第一生产力,在电商的系统里也存在这样的真理!

为了降低 DB 的压力,我们通常会引入缓存来解决问题。redis 做一个缓冲操作,让请求先访问到 redis,而不是直接访问 MySQL 等数据库。

电商系统中的缓存+DB模式

上图就是一个电商系统中的缓存 + DB 模式系统简图。

在这个业务场景,主要是解决读数据从 Redis 缓存,一般都是按照下图的流程来进行业务操作。

电商系统 Redis + DB 的架构图!

但是引入 Redis 缓存后,会带来一些新问题。比如标题中的数据一致性问题,以及缓存设计不合理,缓存穿透等问题。

所以并没有完美的技术,完美的架构。都是选择各自的优点,并使用它们的优点打造一流的系统。

数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。你到底是先操作数据库呢?还是先操作缓存?

不管是先写 MySQL 数据库,再删除 Redis 缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。

如果删除了缓存 Redis,还没有来得及写库 MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。

如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。

出现问题后,我们就要思考如何去解决这类问题。

同志们,你们先思考一下如何解决这类问题?想要成功牛逼的人,必须要有牛逼的想法。伟人的成功都离不开思考啊!

先给大家提个醒,推荐几个解决方案。如:采用延时双删策略,设置缓存过期时间策略,异步更新缓存(基于订阅binlog的同步机制)策略等。具体的策略,我们明天继续!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 电商系统高并发场景中的缓存 DB 数据一致性问题!