Redis和MySQL怎么保持数据统一

59次阅读
没有评论

共计 1220 个字符,预计需要花费 4 分钟才能阅读完成。

这期内容当中丸趣 TV 小编将会给大家带来有关 Redis 和 MySQL 怎么保持数据统一,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1. 第一种方案:采用延时双删策略

在写库前后都进行 redis.del(key) 操作,并且设定合理的超时时间。

伪代码如下:

public void write(String key,Object data){ redis.delKey(key); db.updateData(data); Thread.sleep(500); redis.delKey(key); }

2. 具体的步骤就是:

1)先删除缓存

2)再写数据库

3)休眠 500 毫秒

4)再次删除缓存

那么,这个 500 毫秒怎么确定的,具体该休眠多久呢?

需要评估自己的项目的读数据业务逻辑的耗时。这么做的目的,就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据。

当然这种策略还要考虑 redis 和数据库主从同步的耗时。最后的的写数据的休眠时间:则在读数据业务逻辑的耗时基础上,加几百 ms 即可。比如:休眠 1 秒。

3. 设置缓存过期时间

从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。

4. 该方案的弊端

结合双删策略 + 缓存超时设置,这样最差的情况就是在超时时间内数据存在不一致,而且又增加了写请求的耗时。

2、第二种方案:异步更新缓存 (基于订阅 binlog 的同步机制)

1. 技术整体思路:

MySQL binlog 增量订阅消费 + 消息队列 + 增量数据更新到 redis

1)读 Redis:热数据基本都在 Redis

2)写 MySQL: 增删改都是操作 MySQL

3)更新 Redis 数据:MySQ 的数据操作 binlog,来更新到 Redis

2.Redis 更新

1)数据操作主要分为两大块:

一个是全量 (将全部数据一次写入到 redis)

一个是增量(实时更新)

这里说的是增量, 指的是 mysql 的 update、insert、delate 变更数据。

2)读取 binlog 后分析,利用消息队列, 推送更新各台的 redis 缓存数据。

这样一旦 MySQL 中产生了新的写入、更新、删除等操作,就可以把 binlog 相关的消息推送至 Redis,Redis 再根据 binlog 中的记录,对 Redis 进行更新。

其实这种机制,很类似 MySQL 的主从备份机制,因为 MySQL 的主备也是通过 binlog 来实现的数据一致性。

这里可以结合使用 canal(阿里的一款开源框架),通过该框架可以对 MySQL 的 binlog 进行订阅,而 canal 正是模仿了 mysql 的 slave 数据库的备份请求,使得 Redis 的数据更新达到了相同的效果。

上述就是丸趣 TV 小编为大家分享的 Redis 和 MySQL 怎么保持数据统一了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计1220字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)