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 804C Ice cream coloring
Ice cream coloring 题解: 这个题目中最关键的一句话是, 把任意一种类型的冰激凌所在的所有节点拿下来之后,这些节点是一个连通图(树). 所以就不会存在多个set+起来之后是一个新的完 ...
- 2018湖南多校第二场-20180407 Barareh on Fire
Description The Barareh village is on fire due to the attack of the virtual enemy. Several places ar ...
- tomcat,nginx日志定时清理
1. Crontab定时任务 Crontab 基本语法 t1 t2 t3 t4 t5 program 其中 t1 是表示分钟,t2 表示小时,t3 表示一个月份中的第几日,t4 表示月份,t5 表示一 ...
- Shell脚本分析服务器性能
概述 我们原先在服务器上想分析性能指标,需要执行一系列的linux命令.对于linux命令不熟悉的人来说,比较困难 现在有一套集成的shell脚本,把常用的linux命令都包含在里面,一键式分析性能瓶 ...
- 选择正确的 Fragment#commitXXX() 函数
转自: http://www.tuicool.com/articles/q6R7nii 最新版本(v24.0.0)的 Support v4 库中的 FragmentTransaction 添加了 co ...
- java中的GC
1.GC发生在JVM中的堆区 2.GC是很么? 1.次数上频繁收集Young区 Minor GC 2.次数上较少收集Old区 Full GC 3.基本不动的Perm区 3.G ...
- mybatis动态拼接条件的技巧 where 1=1 或者where标签
/** * 根据输入的学生信息进行条件检索 * 1. 当只输入用户名时, 使用用户名进行模糊检索: * 2. 当只输入邮箱时, 使用性别进行完全匹配 * 3. 当用户名 ...
- Spring Boot (三): ORM 框架 JPA 与连接池 Hikari
前面两篇文章我们介绍了如何快速创建一个 Spring Boot 工程<Spring Boot(一):快速开始>和在 Spring Boot 中如何使用模版引擎 Thymeleaf 渲染一个 ...
- ORA-08102异常重现及恢复
现象: 在表上面新建主键报ORA-08102的异常: SQL> alter table t add primary key(id); alter table t add primary key( ...
- [Pandas] 05 - Parallel processing
相关资源 [Python] 09 - Multi-processing [Pandas] 01 - A guy based on NumPy [AI] 深度数学 - Bayes 这章非常有意思,但一定 ...