临时数据的最佳存储选项

Best storage option for temporary data

在我正在开发的应用程序的上下文中,我需要在有限的时间内存储相当多的数据 - 考虑对象桶方面的场景 - 在一定的有限时间内对象处于一些桶然后他们移动到其他人和其他人......等等。对象(数百万)和桶(数千到数万)之间基本上存在 n 到 m 的关系

持久存储层很重要,这样在应用程序/服务器出现故障时,我可以重新创建最后的状态。

实现这种临时存储的最佳选择是什么

谢谢

如果一个对象一次只能属于一个桶,那么这应该很适合 Postgres - 您只需要一个 buckets table 和一组唯一的桶标识符,并且那么对象的 table 将有一个 currentbucket 列来指示它们当前所属的存储桶。

如果一个对象可以属于无限数量的桶,那么您仍然可以使用 Postgres,但是您需要从对象的 table 中删除 currentbucket 列,并改为使用a bucketobjectjoin table,其中有一列用于存储桶标识符,一列用于对象标识符。由于您已经在使用 Postgres,我建议您首先以这种方式实现它。如果您对性能不满意,那么您可以在 Redis 中缓存 bucketobjectjoin table(作为键控到对象标识符的 Set 存储桶标识符,and/or 作为Set 键控到存储桶标识符的对象标识符)- 您只将对象的键(而不是完整的对象)存储在 Redis 中,因此内存应该不是问题,并且您可以偶尔同步后台任务Redis 与 Postgres 的 bucketobjectjoin table 以防 Redis 服务器崩溃。

作为一种成熟的 nosql 方法,您可以使用 Cassandra 来存储完整的对象; Cassandra 像 Redis 一样支持 Sets,但没有 Redis 的内存限制。

我们过去常常将临时数据保存在我们的 SQL 服务器中,但后来我们迁移到 memcached,我们可以看到显着的性能改进 - 主要是因为数据在内存中而不是在磁盘上。从去年开始,我们只使用 Redis,它有更多的优势,比如支持更多的类型,或者不需要因为大小限制而破坏这些对象。

所以如果你的数据很大而且变化很大而且也是临时的那么我建议使用redis。你可以拥有一个由 1 个主服务器和 2 个从服务器组成的 redis 集群,这将为你提供你正在寻找的 HA。