【问题标题】:How about redis hash performanceredis哈希性能怎么样
【发布时间】:2013-03-24 00:38:12
【问题描述】:

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

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

现在,我有两个解决方案

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

【问题讨论】:

标签: performance hash redis


【解决方案1】:

这将取决于几件事:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2020-11-08
      • 2014-10-28
      • 2013-11-17
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多