4

我有一个有 20 个字段的对象 A,我有 100 万个对象 A 实例。

我想将它们存储在 Redis 中,每次都必须检索 100 多个实例。

现在,我有两个解决方案

  1. 在json中序列化对象A的实例,并存储它使用SET key json
  2. 将每个字段存储到一个哈希字段中,每个实例对应一个哈希映射。正如我之前所说,我每次都必须检索 100 多个实例。所以如果我使用redis hash,我必须调用数百个管道HGETALL key,它会很慢。所以我想知道我是否可以通过使用哈希来提高速度?
4

2 回答 2

3

这将取决于几件事:

  1. 你的 Redis 服务器有多少 RAM 可用
  2. 您要存储多少个对象
  3. 序列化对象的大小及其字段

存储序列化对象将占用更多空间,因为您将所有额外的语言特定信息与原始数据一起存储。如果您的 RAM 不足或必须存储大量对象,最好将所有这些数据存储在哈希中。由于您有 100 万行,因此使用散列可能会节省相当多的空间。

我最近遇到了一个非常相似的问题。起初我尝试将序列化的对象存储在 Redis DB 中,但我必须存储超过 500 万个对象,并且每个对象都包含很多我不需要存储在 DB 中的多余数据。这导致了膨胀的 DB 大小并浪费了大量的 RAM。

您的要求可能与我的要求有很大不同,因此最好自己进行基准测试。尝试序列化一个对象,看看结果有多大。将其与键总和的大小进行比较,并比较两者之间的大小差异。如果序列化的对象不大,最好只进行序列化。记住反序列化不是一个微不足道的操作也很好。

于 2013-04-02T20:54:34.747 回答
2

字符串和哈希是非常不同的数据类型,它们都有优点和缺点。在你暴露的情况下,你错过了一些非常重要的事情;例如:

  • 你打算多久写一次密钥?
  • 您是否需要检索 100 个项目来聚合它们?在这种情况下,用聚合值存储散列是没有意义的,所以检索只进行一次?
  • 这是一个重写入还是重读应用程序?
  • 你需要原子地写吗?换句话说,2 个同时请求可以更新 Redis 中的相同值吗?如果是这样,您将如何保证存储 JSON 字符串不会导致竞争条件?

仅根据性能做出决定并不是一个好主意,您可能会遗漏一些其他重要方面,例如完整性、可伸缩性和可维护性。

于 2018-02-16T14:55:23.820 回答