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的出现,很大程 ...
随机推荐
- codeforces 799 C. Fountains(二分+思维)
题目链接:http://codeforces.com/contest/799/problem/C 题意:要求造2座fountains,可以用钻石,也可以用硬币来造,但是能用的钻石有限,硬币也有限,问能 ...
- Light It Up CF1000B 思维
Light It Up time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- SecureCRT安装及破解
### SecureCRT简介 > SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. > &g ...
- 【LeetCode】[0002] 【两数之和】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给出两个非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果 ...
- vmware vsphere client 创建虚拟机
浏览器访问https://192.168.120.29 用户名:administrator@zhcs.com 密码: Deyi123456! 说明:此案例为创建linux的Centos7的操作系统的 ...
- 史上最全Docker环境安装指南-让安装docker简单到爆
一.思考❓❔ 1.什么是Docker? 装应用的容器 开发.测试.运维都偏爱的容器化技术 轻量级 扩展性 一次构建.多次分享.随处运行 2.安装Docker难不难? So easy! 此文看过之后,读 ...
- change,Ringo题目
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- ubuntu 12.04下访问windows共享文件夹
ubuntu 12.04LTS已经不支持smbfs文件系统,所以不能用mount -smbfs 来映射windows共享文件夹. 常见有两种方法 1.terminal下 mount //192.168 ...
- 强大的时间处理库 moment
中文文档: http://momentjs.cn/docs/ 常用方法 1.当前时间对象 moment () / 指定时间对象 moment("2019-09-19 08:00:0 ...
- 〈三〉ElasticSearch的认识:搜索、过滤、排序
目录 上节回顾 本节前言 文档的搜索 URL参数条件搜索 请求体条件搜索 语法与示例: 补充: 小节总结: 文档的过滤filter 语法与举例: filter与bool constant_score ...