Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 我应该信任Redis的数据完整性吗?_Performance_Redis_Data Integrity - Fatal编程技术网

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

Performance 我应该信任Redis的数据完整性吗?,performance,redis,data-integrity,Performance,Redis,Data Integrity,在我当前的项目中,我将PostgreSQL作为主数据库,而Redis作为从属数据库,例如,当某个用户添加另一个用户作为朋友时,首先关系将存储在PostgreSQL中,然后更新Redis中的朋友列表。当某个用户的好友列表被请求时,它将被从Redis而不是PostgreSQL中取出 问题是:当我在Redis中更新好友列表时,我应该从PostgreSQL中获得一个新的副本,并用新的列表替换Redis中的旧列表,还是应该保留旧列表并简单地将用户ID添加到列表中?后者当然在性能上是最好的,但直觉上前者在保

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


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

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

为了便于讨论,请在您的问题中用MySQL替换Redis,并扪心自问:数据完整性会受到影响吗

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

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


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

您应该评估一致性对应用程序的重要性,并从中吸取教训。如果你失约了,这听起来不像是任何人的哭声。您可以有一个后台进程,从PostgreSQL读取数据并将其推回Redis,最终清除任何不一致。或者,您可以查看从写主机复制的读从PostgreSQL实例。这将使您使用经过良好测试的同步技术获得更好的读取可伸缩性

+1-同意。。。进一步指出/注意,在这个场景中,选择使用redis作为从设备而不是主设备对我来说似乎很奇怪。如果在这种情况下可伸缩性优于一致性要求,为什么不使用redis作为权威源(如果单个服务器无法处理负载,则设置垂直切分的密钥空间),然后复制到cassandra或其他水平可伸缩存储?@Sripathi,我完全知道您提到的问题,无论我选择何种方法,数据损坏都会以相同的速度发生,但这是唯一发生损坏的地方吗?由于Redis不符合ACID标准,我想知道我应该多久从主服务器重建一次其数据,或者将其视为ACID数据(当然是在这个特定的senario中)?@codemonkey事实上我需要一致性,所以我选择Postgres作为主服务器,因为可以从主服务器重建Redis数据,理论上,发送给用户的数据可以“几乎”一致。redis作为一台服务器运行时是一致的。写入是原子的,并且是序列化的。您甚至可以通过一点工作强制执行事务和回滚。像cassandra这样的东西可以更好地提供最终的一致性和水平可伸缩性。如果你说的“一致性”实际上是指“持久性”,那就不同了。。。一个可以被告知的问题是:是的,我想在一致性和性能之间进行权衡,这就是为什么我选择Redis作为奴隶。进行一次持续的数据迭代/重建似乎是安全的,但需要一点资源?事实上,我想知道的是,Redis有多迫切地需要这个答案。