redis哈希性能如何?

时间:2013-04-02 16:05:41

标签: performance hash redis

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

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

现在,我有两个解决方案

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

2 个答案:

答案 0 :(得分:1)

这取决于一些事情:

  1. Redis服务器可用的RAM大小
  2. 您要存储多少个对象
  3. 序列化对象及其字段的大小
  4. 存储序列化对象将占用更多空间,因为您将所有额外的特定于语言的信息与原始数据一起存储。如果您缺少RAM或必须存储大量对象,那么最好将所有这些数据存储在哈希中。由于你有100万行,你可能会通过使用哈希来节省相当多的空间。

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

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

答案 1 :(得分:1)

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

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

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