Redis与数据库数据一致性
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。
可能谈到保持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与数据库数据一致性的更多相关文章
- 如何保证Redis与数据库的数据一致性
一般来说,只要你用到了缓存,不管是Redis还是memcache,就可能会涉及到数据库缓存与数据的一致性问题,这里我们以Redis为例. 我们该如何保证Redis与数据库的一致性呢? So easy: ...
- Redis和数据库的数据一致性问题
在数据读多写少的情况下作为缓存来使用,恐怕是Redis使用最普遍的场景了.当使用Redis作为缓存的时候,一般流程是这样的. 如果缓存在Redis中存在,即缓存命中,则直接返回数据 如果Redis中没 ...
- Redis 当成数据库在使用和可靠的分布式锁,Redlock 真的可行么?
怎样做可靠的分布式锁,Redlock 真的可行么? https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html ...
- Redis和数据库 数据同步问题
Redis和数据库同步问题 缓存充当数据库 比如说Session这种访问非常频繁的数据,就适合采用这种方案:当然了,既然没有涉及到数据库,那么也就不会存在一致性问题: 缓存充当数据库热点缓存 读操作 ...
- 掘地三尺搞定 Redis 与 MySQL 数据一致性问题
Redis 拥有高性能的数据读写功能,被我们广泛用在缓存场景,一是能提高业务系统的性能,二是为数据库抵挡了高并发的流量请求,点我 -> 解密 Redis 为什么这么快的秘密. 把 Redis 作 ...
- Redis 与 数据库处理数据的两种模式
Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...
- 快速搭建Redis缓存数据库
之前一篇随笔——Redis安装及主从配置已经详细的介绍过Redis的安装于配置.本文要讲的是如何在已经安装过Redis的机器上快速的创建出一个新的Redis缓存数据库. 一.环境介绍 1) Linux ...
- Redis 与 数据库处理数据的两种模式(转)
Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...
- Redis与数据库同步问题
缓存数据与持久化数据的一致性,这个问题总结了一下(看到了一个不错的博文),其实就是读和写,还有就是要注意谁先谁后的问题. Redis 是一个高性能的key-value数据库. redis的出现,很大程 ...
随机推荐
- poj 1797Heavy Transportation(dijkstra变形)
题目链接:http://poj.org/problem?id=1797 题意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上 ...
- dp递推 hdu1978
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- CH4301 Can you answer on these queries III 题解
给定长度为N的数列A,以及M条指令 (N≤500000, M≤100000),每条指令可能是以下两种之一: "2 x y",把 A[x] 改成 y. "1 x y&quo ...
- 2015 JSOI冬令营训练 彩色格子 题解
解析 棋盘上黑白格染色.曼哈顿距离偶数:奇偶性相同. 枚举有几种颜色分到白格,组合数计算即可. 注意预处理,时间还是比较宽裕的. 为了不重复计数,考虑枚举严格用了i种颜色,我们再枚举分配j种给白集合. ...
- 1、pytest中文文档--安装和入门
目录 安装和入门 安装pytest 创建你的第一个测试用例 执行多个测试用例 检查代码是否触发一个指定的异常 在一个类中组织多个测试用例 申请一个唯一的临时目录用于功能测试 安装和入门 Python版 ...
- 一起来读Netty In Action之netty的组件和设计(二)
在上一篇博客中,我们给出了java高性能网络编程的技术基础,也简单的介绍了netty的核心构件,在这一篇博客中,我们将更加详细的研究netty的各个组件,并且密切关注它们是如何通过协作来支撑这些体系结 ...
- 【Offer】[43] 【1~n整数中1出现的次数】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数.例如,输入12, 1~12这些整数中包含1的数字有1.10.11和12,1 ...
- 基于队列queue实现的线程池
本文通过文章同步功能推送至博客园,显示排版可能会有所错误,请见谅! 写在前文:在Python中给多进程提供了进程池类,对于线程,Python2并没有直接提供线程池类(Python3中提供了线程池功能) ...
- cssrelative
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- VS中一些提高编码效率的快捷键
场景 新手入门,看见大神们在VS中只用键盘就可以完成一系列操作. 整理一些常用的能提高效率的快捷键. 关注公众号霸道的程序猿获取编程相关电子书.教程推送与免费下载. 大量编程视频教程:https:// ...