共计 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 行业资讯频道。