我应该相信Redis的数据完整性吗?

时间:2012-06-01 10:01:58

标签: performance redis data-integrity

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

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

2 个答案:

答案 0 :(得分:4)

这与Redis无关。当您写入两个数据库时,即使两个数据库都保证数据完整性,也会出现很多问题。

为了便于讨论,请在您的问题中将Redis替换为MySQL,并问问自己 - 数据完整性是否会受到影响?

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

无论是替换整个记录还是只添加一行都无关紧要。两者都可能导致数据损坏。

如果您关注数据完整性,请将数据保存在单个权威系统中。否则,您需要two phase commit protocol

答案 1 :(得分:1)

您应该评估一致性对您的应用程序的重要性,并从那里开始。如果你松开提交,这听起来不像是任何人的哭泣。您可以使用后台进程从PostgreSQL读取数据并将其推送回Redis,最终清除任何不一致。或者,您可以查看从写主机复制的从属PostgreSQL实例。通过经过良好测试的同步技术,您可以更好地阅读可扩展性。