当前位置: 首页 > 面试题库 >

将Redis数据同步到MySQL的最佳策略是什么?

邓令雪
2023-03-14
问题内容
  1. 用例是使用Redis作为MySQL的本地缓存
  2. MySQL中的数据格式为:单个主键和其他几个字段。不会有查询数据库的交叉表
  3. Redis键是MySQL中的主键,值是包含MySQL中其他字段的哈希
  4. 关闭电源后,少于一分钟的数据丢失是可以接受的。

我的解决方案是:

  1. Redis写入AOF文件,某些进程将监视此文件并将更新的数据同步到MySQL
  2. Hack Redis可以在多个文件中写入AOF,就像MySQL Binlog一样
  3. 数据接口只能通过Redis进行读写

这个解决方案可以吗?
从事这项工作的最佳策略是什么?


问题答案:

您不需要破解任何东西;)

我不完全确定为什么您需要mysql上的数据。如果我知道,也许会有一个更合适的答案。无论如何,作为通用答案,您可以使用redis键空间通知

您可以在键上订阅命令HSET,HMSET,HDEL和DEL,因此,每次删除键或设置或删除哈希值时,您都会收到通知。

请注意,如果您错过任何通知,则将出现不一致的情况。因此,有时您可以仅使用SCAN命令浏览所有密钥,并检查mysql是否需要更新。

另一个策略可能是维护两个单独的结构。一个是带有值的哈希,另一个是所有值的ZSET,这些值按更新时间戳排序。使两种结构保持最新的最佳方法是编写两个或三个lua脚本(插入/更新和删除),这些脚本可对散列和zset进行原子操作。

然后,您可以定期在ZSET中查询时间戳比上次同步操作高的元素,获取所有已更新的密钥(它将包括已删除的密钥,除非您想专门为它们保留第二个ZSET),然后通过键检索所有元素并同步到mysql。

希望它对您有用!



 类似资料:
  • 问题内容: Prevayler保证所有写入(通过其事务)都是同步的。但是读呢? 如果不使用显式同步(在用户代码中),可以进行脏读吗? 如果将业务对象读取为: ? 如果是这样,哪种同步策略对用户代码有利? (考虑业务对象A包含业务对象Bs的集合), 使用同步集合(A中B的集合),例如从java.util.concurrent包中? 同步外部事务的集合读取与内部事务的集合写入,例如在读写之间使用“ s

  • 问题内容: 我在Windows机器上有一个访问数据库,必须将其导入到Linux Web服务器上的mysql中。目前,访问dabatbase表已导出为文本文件,并通过ftp自动复制,然后加载到mysql中。 有没有更好的方法可以执行此操作,也许使用ODBC连接或其他方法? 限制复制已经存在的信息的最佳方法是什么,即仅传输访问数据库中的记录而mysql中尚未的记录。 访问数据库是由另一个程序处理的,最

  • 同步策略即通过设置标签与资源映射项目的对应关系,将公有云下的资源按照规则设置分配给指定项目。 同步策略即通过设置标签与资源映射项目的对应关系,将公有云下的资源按照规则设置分配给指定项目,同步策略仅在云账号同步的时候生效。目前支持的资源为所有带标签的项目资源。 说明 当磁盘、快照、eip等项目资源绑定到其他资源上时,将会按照其他资源上的标签,将其同步到对应项目中,若磁盘、快照、eip等未关联资源,则

  • 问题内容: 我的要求是我有服务器J2EE Web应用程序和客户端J2EE Web应用程序。有时客户端可以脱机。当客户上线时,他应该能够来回同步更改。我还应该能够基于一些过滤器/规则来控制哪些行/表需要同步。有没有现成的Java框架可以做到这一点?如果我需要自己实施,您可以建议哪些不同的策略? 我想到的一个解决方案是维护SQL日志并在同步期间在另一端执行相同的语句。您认为此策略有任何问题吗? 问题答

  • 问题内容: 这个问题已经在这里有了答案 : 同步客户端-服务器数据库 (6个答案) 5年前关闭。 我正在一个包含Web应用程序和移动应用程序的项目,该项目记录每日用户的数据。用户可以删除,更新其数据,并且可以使用许多设备来插入数据。 我打算以这种方式进行开发: 用户输入数据,然后插入SQLite。服务将定期(每5小时或每秒钟)启动,以使用时间戳与MySQL同步。 我确实使用互联网上的服务和时间戳来

  • 问题内容: 我需要将数据库从sqlite迁移到mysql,并且各种工具/脚本对我来说太多了,无法轻松找到最安全,最优雅的解决方案。 在我看来,这看起来不错http://djangosnippets.org/snippets/14/,但距获取更新令人担忧,似乎已经过去了三年。 您是否可以推荐一个在Django 1.1.1上可靠的解决方案? 问题答案: 执行: 接下来,将你的settings.py更改