专栏首页Node开发Redis与数据库数据一致性

Redis与数据库数据一致性

可能谈到保持RedisMysql双库的数据一致性,可能很多人最先想到的方案就是读请求和写请求串行化,串到一个内存队列里去。但是这个方案有着一个致命的缺点:读请求和写请求串行化会导致系统的吞吐量大幅度降低,需要使用比正常情况下多几倍的机器去支撑线上的一个请求。RedisMysql双库的数据一致性问题为何会出现呢?其实我们可以考虑这么一个业务场景:我们需要更新部分数据,我们首先更新数据库数据,然后清除Redis缓存中的数据。但是数据库更新操作成功了,然而Redis清除缓存出现异常了,这样会导致出现这么一种情况:数据库中的数据已经更新为最新数据,但是Redis缓存中的数据依旧还是老数据,这时候就会出现RedisMysql双库的数据一致性问题。

有些喜欢投机取巧的朋友就会想,那我先清掉缓存中的旧数据,然后再写入新数据到数据库,最后更新缓存不就可以了么?这种方式可能出现一种问题:我们清除Redis缓存成功了,但是写入还未将新数据写入到数据库之前有读请求的发生,就会导致数据库中的旧数据再次存入Redis中,然后等到新数据写入到数据库后,一样产生了。RedisMysql双库的数据一致性问题。

昨天谈到Redis分布式环境其实有说到,分布式环境下,数据读写操作是并发操作,所以导致对用一份数据进行读写操作先后执行顺序无法保证,所以就可能出现读操作先于写操作被执行,这时就会出现脏数据导致数据一致性问题的产生。这时候我们需要考虑我们读取的数据是否是强一致性数据,比如账户余额这种必须是强一致性数据,则读数据库,如果读取的数据实时性没有非常严格,比如积分排行榜等,就可以直接读取Redis数据。如果机器并发量不高的情况下,读取数据优先从Redis中读取,缓存中数据不存在才选择从数据库中获取,并且把从数据库获取到的数据写入Redis。写入数据则相反,先清除Redis缓存数据,再写入数据到数据库,如果是简单数据这时候可以实时写入到Redis中供读操作读取,如果是需要多表连表查询的数据,则可以暂时不写入Redis,等到有查询操作的时候再写入到Redis

那如果是高并发的情况下呢?在高并发的情况下,读取数据操作和上面是一样,优先从Redis读取。但是写入数据操作就和刚才做法不一样了,高并发的情况下,写入数据先写入到Redis,然后定期从Redis写入到Mysql中。高并发的情况下需要注意的是,每个读取数据的请求都需要在超时时间内返回数据,如果数据更新很频繁,可能会导致Redis积压了一系列更新操作,从而导致大量的读取数据请求超时,最后这大量的读取数据请求全部压到数据库,导致缓存击穿的现象产生,严重可能导致数据库宕机。这时候解决方案其实一般通过增加机器来增加吞吐量,或者暂时先返回一个老数据给客户端。

所以到这里我们其实方案很明确了,一共有两种比较常见的方案:Redis是作为缓存服务器使用,一般作为缓存有两个用途:请求快速处理和减少I/O频率。减少I/O频率实际上就是刚才所说的高并发情况下数据实时写入到数据库,然后数据积累到一定程度定期写入到数据库,请求快速处理就是处理读请求时有限从Redis中获取,Redis是支持高并发操作的,所以处理速度很快,如果Redis中不存在数据,再去数据库中查询,然后写入到redis中缓存,以便二次读取可以直接从缓存中取到数据。

第二种方案其实就是异步异步缓存,Redis缓存热门数据,增删改查都在Mysql操作,只要Mysqlinsertupdatedelete操作,可以通过kafka或者rabbitMQ等第三方消息推送工具将binlog相关的消息推送到Redis中,Redis解析binlog中的数据对Redis缓存中的数据进行更新,Mysql中的主从备份机制也是通过binlog来实现数据一致性的。

本文分享自微信公众号 - 程序猿周先森(zhanyue_org),作者:逆月翎

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一篇文章了解Redis数据库

    redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sor...

    逆月翎
  • Redis缓存击穿、缓存穿透、缓存雪崩

    上篇文章谈到了Redis分布式锁,实际上就是为了解释为什么做缓存采用Redis而不使用map/guava。缓存分为本地缓存和分布式缓存。以 Java 为例,使...

    逆月翎
  • Redis系列总结--这几点你会了吗?

    前面几篇已经对Redis中几个关键知识点做了介绍,本篇主要对Redis系列做一下总结以及对Redis中常见面试题简单进行介绍一下。首先我们对前面几篇谈到的Red...

    逆月翎
  • 又把锅甩给中国!苹果和解给了300多亿,但高通业绩预测并不乐观

    这是高通首席执行官Steve Mollenkopf在接受电话采访时,对高通接下来一个季度收入不及分析师预期给出的解释。

    量子位
  • 混合云的备忘清单

    虽然越来越多的企业将其业务工作负载地转移到云端,但监管障碍、安全问题、对遗留应用程序的依赖、异常数据集或工作流等某些情况已经成为组织将业务迁移到公共云的障碍。

    静一
  • 十问大数据安全分析(大数据安全的小船怎样才能不翻?)

    导语:人类的生产生活每天都在产生大量的数据,并且产生的速度越来越快。新的攻击手段层出不穷,需要检测的数据越来越多,现有的分析技术不堪重负。 ? 安全数据的数量...

    灯塔大数据
  • 论一个程序员的自我修养-从一张图片说起

    本来今天想写.NET Core实战之CMS系统第十五篇文章的。哈,奈何今天在新生命人脉群里面看到石头哥分享的一张图片,然后大家就议论了起来,不过我看的很懵逼,这...

    依乐祝
  • liquibase和flyway中分布式锁实现的区别?

    大家可能都知道,锁的存在本质上是为了解决共享资源互斥访问的问题,为了解决这个问题,在单机系统中(一个进程),很多开发语言都提供了锁的特性,比如说java的syn...

    Bruce Li
  • Java程序员该如何突破瓶颈!

    源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂。

    Java团长
  • 数据分析没有思路怎么办?

    今天教大家一个方法(逻辑树分析方法),可以把这些零散的想法整理成有条理的思路,帮助你快速解决问题。

    张俊红

扫码关注云+社区

领取腾讯云代金券