临时数据的最佳存储选项
Best storage option for temporary data
在我正在开发的应用程序的上下文中,我需要在有限的时间内存储相当多的数据 - 考虑对象桶方面的场景 - 在一定的有限时间内对象处于一些桶然后他们移动到其他人和其他人......等等。对象(数百万)和桶(数千到数万)之间基本上存在 n 到 m 的关系
持久存储层很重要,这样在应用程序/服务器出现故障时,我可以重新创建最后的状态。
实现这种临时存储的最佳选择是什么
- 关系型 SGBD - 我们目前正在使用 PostgreSQL,它会是一个
选项?我主要担心它对这种情况做出反应的能力
使用场景。可以选择另一个 SGBD 吗?
- 一个 NOSQL 持久性提供程序 - 我主要在 Redis 考虑
令人印象深刻的写入/读取速度,但其他数据库,不一定来自
键值族也可以。
谢谢
如果一个对象一次只能属于一个桶,那么这应该很适合 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 一样支持 Set
s,但没有 Redis 的内存限制。
我们过去常常将临时数据保存在我们的 SQL 服务器中,但后来我们迁移到 memcached,我们可以看到显着的性能改进 - 主要是因为数据在内存中而不是在磁盘上。从去年开始,我们只使用 Redis,它有更多的优势,比如支持更多的类型,或者不需要因为大小限制而破坏这些对象。
所以如果你的数据很大而且变化很大而且也是临时的那么我建议使用redis。你可以拥有一个由 1 个主服务器和 2 个从服务器组成的 redis 集群,这将为你提供你正在寻找的 HA。
在我正在开发的应用程序的上下文中,我需要在有限的时间内存储相当多的数据 - 考虑对象桶方面的场景 - 在一定的有限时间内对象处于一些桶然后他们移动到其他人和其他人......等等。对象(数百万)和桶(数千到数万)之间基本上存在 n 到 m 的关系
持久存储层很重要,这样在应用程序/服务器出现故障时,我可以重新创建最后的状态。
实现这种临时存储的最佳选择是什么
- 关系型 SGBD - 我们目前正在使用 PostgreSQL,它会是一个 选项?我主要担心它对这种情况做出反应的能力 使用场景。可以选择另一个 SGBD 吗?
- 一个 NOSQL 持久性提供程序 - 我主要在 Redis 考虑 令人印象深刻的写入/读取速度,但其他数据库,不一定来自 键值族也可以。
谢谢
如果一个对象一次只能属于一个桶,那么这应该很适合 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 一样支持 Set
s,但没有 Redis 的内存限制。
我们过去常常将临时数据保存在我们的 SQL 服务器中,但后来我们迁移到 memcached,我们可以看到显着的性能改进 - 主要是因为数据在内存中而不是在磁盘上。从去年开始,我们只使用 Redis,它有更多的优势,比如支持更多的类型,或者不需要因为大小限制而破坏这些对象。
所以如果你的数据很大而且变化很大而且也是临时的那么我建议使用redis。你可以拥有一个由 1 个主服务器和 2 个从服务器组成的 redis 集群,这将为你提供你正在寻找的 HA。