Redis和MySQL数据一致性方案详解

一、需求起因

高并发业务场景,数据库通常都是用户并发访问最薄弱的环节。所以,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问 MySQL 等数据库。

从 Redis 读数据,一般都是按照下图的流程来进行业务操作:

读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。不管是先写数据库,再删除缓存;还是先删除缓存,再写数据库,都有可能出现数据不一致的情况。比如:

  1. 如果删除了缓存,还没有来得及写库,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。
  2. 如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。

因为写和读是并发的,无法保证顺序,就会出现缓存和数据库的数据不一致的问题。如何解决?

二、缓存和数据库一致性解决方案

1️⃣采用延时双删策略

在写库前后都进行 redis.del(key) 操作,并且设定合理的超时时间。伪代码如下:

//具体的步骤:先删除缓存;再写数据库;休眠500毫秒;再次删除缓存。
public void write(String key,Object data){
   redis.delKey(key);
   db.updateData(data);
//不休眠的话,读请求还有可能未结束,造成脏数据
   Thread.sleep(500);
   redis.delKey(key);
}

这个500毫秒怎么确定的,具体该休眠多久呢?
需要评估具体项目的读数据业务逻辑的耗时。目的就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据。

当然这种策略还要考虑 Redis 和数据库主从同步的耗时。最后的写数据的休眠时间:在读数据业务逻辑的耗时基础上,加几百毫秒即可。比如:休眠 1 秒。

设置缓存过期时间
从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。

该方案的弊端
结合双删策略+缓存超时设置,这样最差的情况就是在超时时间内数据存在不一致,而且又增加了写请求的耗时。

2️⃣异步更新缓存(基于订阅binlog的同步机制)

技术整体思路:
MySQL binlog 增量订阅消费+消息队列+增量数据更新到 redis

读 Redis:热数据基本都在 Redis
写 MySQL:增删改都是操作 MySQL
更新 Redis 数据:MySQL 的数据操作 binlog,来更新到 Redis

Redis更新:

  1. 数据操作主要分为两大块:
    一个是全量(将全部数据一次写入到 Redis)、一个是增量(实时更新)。这里说的增量,指的是 MySQL 的 update、insert、delate 变更数据。

  2. 读取 binlog 后分析,利用消息队列,推送更新各台的 Redis 缓存数据。这样一旦 MySQL 中产生了写入、更新、删除等操作,就可以把 binlog 相关的消息推送至 Redis,Redis 再根据 binlog 中的记录,对 Redis 进行更新。其实这种机制,很类似 MySQL 的主从备份机制,因为 MySQL 的主备也是通过 binlog 来实现的数据一致性。
    这里可以结合使用 canal(阿里的一款开源框架),通过该框架可以对 MySQL 的 binlog 进行订阅,而 canal 正是模仿了 MySQL 的 slave 数据库的备份请求,使得 Redis 的数据更新达到了相同的效果。
    当然,这里的消息推送工具也可以采用别的第三方:kafka、RabbitMQ等来实现推送更新 Redis。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容