redis事务能保证一致性吗

如何解决Redis缓存和MySQL数据一致性的问题?

Redis缓存和MySQL数据一致性的问题,相信大家在大量使用redis缓存进行业务开发的场景下是一定要考虑的问题。

总有运营、产品、测试人员过来问你为什么我刚刚更新了一条数据,APP上还是原来的数据呢?你总是一句话:“加了缓存,等会儿就好”。有可能是1分钟,有可能是半小时。问你的都属于关系不错,不问你直接给你提bug你也没办法。

下面就分享一下我个人在工作中对如何解决redis缓存和MySQL数据一致性的一些心得:

大家看了这个图是不是就知道什么意思了?一个请求过来查询数据,我先看看redis有没有,有直接返回,没有就去数据库查出来,顺便同步到redis,设置一下过期时间。下次同样的数据查询redis缓存就可以直接返回了。是不是很简单很粗暴?在实时性要求不高的场景下,这种方式我估计是大家最常用的一种方式。但是他有几个问题:

无法保证一致性:数据库更改了数据,redis里的数据就和数据库不一致了,产生脏读;

缓存雪崩:这种方案要求redis里的缓存必须设置有效期,如果在同一时间大面积过期,所有请求压力都指向数据库,这个时候数据库顶不住压力就会宕机,然后整个世界都安静了;

缓存穿透:查询一个数据,缓存没有,去查询数据库,数据库也没有,怎么办?这样的请求多了对数据库也是压力,没有数据的时候也需要在redis缓存一个空值。

针对第一种方案的问题,那么大多数时候我们会继续做一个job,去定时同步数据库里的数据都redis缓存中,我们的业务请求直接查询redis缓存,无论有或者没有数据都直接返回结果。这样可以避免缓存穿透、缓存雪崩等问题,也能缓解redis缓存和数据库不一致的情况,但是还无法彻底解决一致性的问题。在job的间隔期内对数据的修改必须要等到下一次job的运行。

对软件开发同学来说,这个场景太常见了。基本的思路是:mysql数据发生变更的时候,要及时清除redis缓存。那究竟要怎样清除呢?

分两种情况来说吧。

单集群。在redis集群和mysql集群都是单集群部署的情况下,需要确保如果redis查不到数据读取mysql主库来填充数据,此时只需要在mysql变更生效后,直接调用redis清缓存即可。

多集群。在redis集群和mysql集群都是多地多机房的部署情况下。采用单集群清缓存策略清除本机房redis集群缓存后,延迟消息通知其他机房redis集群(确保其他机房mysql集群已收到本机房mysql集群的binlog变更消息并将变更生效)。

希望能解答您的问题,喜欢的话可以关注下我哈

要看应用场景,数据变动频繁的环境中,使用读缓存是毫无意义的,反而加重系统负荷,因为要花费额外资源维护缓存和数据源的一致性。

其实redis可以当作数据库的元数据使用,设计好数据结构就是一个简单的关系型库,业务数据完全放到redis中运行,MySQL当作后备库使用。redis也有持久化机制而且很容易做镜像,因此可以在很大时间粒度上进行数据同步,比如一天同步一次。而业务层只操作redis,与数据库完全剥离,即使数据库挂掉也不会导致业务中断。

随着技术发展,现在项目技术选型不像从前那样单一的,特别是在高并发场景下的项目,都是多种技术配套着来使用。在以前,对于用户数据无论是增删改查,我们都是直接操作数据库的,但在高并发场景下这样做显然是不合理的,于是乎我们在DB层之前加上Cache层,以此来缓解DB层的压力。

在业界通常是将MySQL作为数据最终落地的存储方案,而用Redis来缓存热点数据。一般是读数据是从Redis中读取,增删改则是操作MySQL。但是这样会存在一个问题,即:读操作和写操作是并发的,执行顺序无法保证,这样很容易出现缓存数据与数据库中的数据不一致。

举例说明一下:

假设我们更新了数据库后,缓存一直没有失效,那我们从缓存中读取的就是脏数据。

假设缓存中的数据不存在,我们从数据库中读取数据然后存入缓存,此时数据库刚好更新,那在缓存期间内,这个缓存数据就是脏数据。

如何避免Redis和MySQL中数据一致性问题呢?结合我的经验给出一些方案供大家参考:

1、首先确定你的业务是否要求缓存和数据库之间是强一致性关系

如果你的业务要求数据库和缓存之间是强一致性,那你要做的就是确保每次更新了MySQL后就同步更新Redis;

如果不需要强一致性,那我们合理控制好缓存的TTL即可。

2、借助MQ消息来更新缓存

到此,以上就是小编对于redis事务能保证一致性吗为什么的问题就介绍到这了,希望这1点解答对大家有用。

名称栏目:redis事务能保证一致性吗
转载来于:http://www.mswzjz.cn/qtweb/news24/421074.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能