5

在我目前的项目中,我有 PostgreSQL 作为我的主数据库,而 Redis 作为一种从属,例如,当一些用户添加另一个作为朋友时,首先将关系存储在 PostgreSQL 中,然后更新 Redis 中的朋友列表. 当请求某个用户的好友列表时,它将被拉出 Redis 而不是 PostgreSQL。

问题是:当我在 Redis 中更新好友列表时,我应该从 PostgreSQL 中获取一份新副本,并用新的替换 Redis 中的旧列表,还是应该保留旧列表并将用户 ID 简单地添加到列表中?后者当然最适合性能,但直观地说,前者在保持数据完整性方面做得更好吗?如果使用像 Celery 这样的东西,第二种方法值得冒险吗?

4

2 回答 2

4

这与 Redis 无关。当您写入两个数据库时,即使它们都单独保证数据完整性,很多事情也会出错。

为了便于讨论,请在您的问题中将 Redis 替换为 MySQL,然后问自己 - 数据完整性会受到损害吗?

您可能已经写入 Postgres,然后您的进程可能会在不写入 MySQL 的情况下死亡。或者可能是网络中断。或者也许 MySQL 已关闭。在所有这些情况下,Postgres 和 MySQL 将开始有所不同。

无论您是替换整条记录还是简单地添加一行都没有关系。两者都可能导致数据损坏。

如果您关心数据完整性,请将数据保存在单一权威系统中。否则,您将需要一个两阶段提交协议

于 2012-06-01T10:37:32.083 回答
1

您应该评估一致性对您的应用程序的重要性,并从那里着手。如果您放弃提交,这听起来不像任何人的哭泣。您可以有一个后台进程从 PostgreSQL 读取数据并将其推回 Redis,最终清除所有不一致之处。或者,您可以查看从写入主机复制的读取从属 PostgreSQL 实例。这将使您使用经过良好测试的同步技术获得更好的读取可扩展性。

于 2012-06-01T13:27:59.873 回答