文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。

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

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

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

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

所以到这里我们其实方案很明确了,一共有两种比较常见的方案:Redis是作为缓存服务器使用,一般作为缓存有两个用途:请求快速处理和减少I/O频率。减少I/O频率实际上就是刚才所说的高并发情况下数据实时写入到数据库,然后数据积累到一定程度定期写入到数据库,请求快速处理就是处理读请求时有限从Redis中获取,Redis是支持高并发操作的,所以处理速度很快,如果Redis中不存在数据,再去数据库中查询,然后写入到redis中缓存,以便二次读取可以直接从缓存中取到数据。
第二种方案其实就是异步异步缓存,Redis缓存热门数据,增删改查都在Mysql操作,只要Mysql有insert、update、delete操作,可以通过kafka或者rabbitMQ等第三方消息推送工具将binlog相关的消息推送到Redis中,Redis解析binlog中的数据对Redis缓存中的数据进行更新,Mysql中的主从备份机制也是通过binlog来实现数据一致性的。

本文由博客一文多发平台 OpenWrite 发布!

Redis与数据库数据一致性的更多相关文章

  1. 如何保证Redis与数据库的数据一致性

    一般来说,只要你用到了缓存,不管是Redis还是memcache,就可能会涉及到数据库缓存与数据的一致性问题,这里我们以Redis为例. 我们该如何保证Redis与数据库的一致性呢? So easy: ...

  2. Redis和数据库的数据一致性问题

    在数据读多写少的情况下作为缓存来使用,恐怕是Redis使用最普遍的场景了.当使用Redis作为缓存的时候,一般流程是这样的. 如果缓存在Redis中存在,即缓存命中,则直接返回数据 如果Redis中没 ...

  3. Redis 当成数据库在使用和可靠的分布式锁,Redlock 真的可行么?

    怎样做可靠的分布式锁,Redlock 真的可行么? https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html ...

  4. Redis和数据库 数据同步问题

    Redis和数据库同步问题 缓存充当数据库 比如说Session这种访问非常频繁的数据,就适合采用这种方案:当然了,既然没有涉及到数据库,那么也就不会存在一致性问题: 缓存充当数据库热点缓存 读操作 ...

  5. 掘地三尺搞定 Redis 与 MySQL 数据一致性问题

    Redis 拥有高性能的数据读写功能,被我们广泛用在缓存场景,一是能提高业务系统的性能,二是为数据库抵挡了高并发的流量请求,点我 -> 解密 Redis 为什么这么快的秘密. 把 Redis 作 ...

  6. Redis 与 数据库处理数据的两种模式

    Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...

  7. 快速搭建Redis缓存数据库

    之前一篇随笔——Redis安装及主从配置已经详细的介绍过Redis的安装于配置.本文要讲的是如何在已经安装过Redis的机器上快速的创建出一个新的Redis缓存数据库. 一.环境介绍 1) Linux ...

  8. Redis 与 数据库处理数据的两种模式(转)

    Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...

  9. Redis与数据库同步问题

    缓存数据与持久化数据的一致性,这个问题总结了一下(看到了一个不错的博文),其实就是读和写,还有就是要注意谁先谁后的问题. Redis 是一个高性能的key-value数据库. redis的出现,很大程 ...

随机推荐

  1. CodeForces 804C Ice cream coloring

    Ice cream coloring 题解: 这个题目中最关键的一句话是, 把任意一种类型的冰激凌所在的所有节点拿下来之后,这些节点是一个连通图(树). 所以就不会存在多个set+起来之后是一个新的完 ...

  2. 2018湖南多校第二场-20180407 Barareh on Fire

    Description The Barareh village is on fire due to the attack of the virtual enemy. Several places ar ...

  3. tomcat,nginx日志定时清理

    1. Crontab定时任务 Crontab 基本语法 t1 t2 t3 t4 t5 program 其中 t1 是表示分钟,t2 表示小时,t3 表示一个月份中的第几日,t4 表示月份,t5 表示一 ...

  4. Shell脚本分析服务器性能

    概述 我们原先在服务器上想分析性能指标,需要执行一系列的linux命令.对于linux命令不熟悉的人来说,比较困难 现在有一套集成的shell脚本,把常用的linux命令都包含在里面,一键式分析性能瓶 ...

  5. 选择正确的 Fragment#commitXXX() 函数

    转自: http://www.tuicool.com/articles/q6R7nii 最新版本(v24.0.0)的 Support v4 库中的 FragmentTransaction 添加了 co ...

  6. java中的GC

    1.GC发生在JVM中的堆区 2.GC是很么? 1.次数上频繁收集Young区  Minor  GC 2.次数上较少收集Old区       Full      GC 3.基本不动的Perm区 3.G ...

  7. mybatis动态拼接条件的技巧 where 1=1 或者where标签

    /**     * 根据输入的学生信息进行条件检索     * 1. 当只输入用户名时, 使用用户名进行模糊检索:     * 2. 当只输入邮箱时, 使用性别进行完全匹配     * 3. 当用户名 ...

  8. Spring Boot (三): ORM 框架 JPA 与连接池 Hikari

    前面两篇文章我们介绍了如何快速创建一个 Spring Boot 工程<Spring Boot(一):快速开始>和在 Spring Boot 中如何使用模版引擎 Thymeleaf 渲染一个 ...

  9. ORA-08102异常重现及恢复

    现象: 在表上面新建主键报ORA-08102的异常: SQL> alter table t add primary key(id); alter table t add primary key( ...

  10. [Pandas] 05 - Parallel processing

    相关资源 [Python] 09 - Multi-processing [Pandas] 01 - A guy based on NumPy [AI] 深度数学 - Bayes 这章非常有意思,但一定 ...