【问题标题】:How about redis hash performanceredis哈希性能怎么样
【发布时间】:2013-03-24 00:38:12
【问题描述】:
我有一个包含 20 个字段的对象 A,我有 100 万个对象 A 实例。
我想将它们存储在 Redis 中,每次都要检索 100 多个实例。
现在,我有两个解决方案
- 在json中序列化对象A的实例,并使用
SET key json存储它
- 将每个字段存储到一个哈希字段中,每个实例对应一个哈希映射。正如我之前所说,我每次都必须检索 100 多个实例。所以如果我使用redis hash,我必须调用数百个
HGETALL key的管道,它会很慢。所以我想知道我是否可以通过使用哈希来提高速度?
【问题讨论】:
标签:
performance
hash
redis
【解决方案1】:
这将取决于几件事:
- 您的 Redis 服务器有多少 RAM 可用
- 您要存储多少个对象
- 序列化对象的大小及其字段
存储序列化对象将占用更多空间,因为您将所有额外的语言特定信息与原始数据一起存储。如果您的 RAM 不足或必须存储大量对象,最好将所有这些数据存储在哈希中。由于您有 100 万行,因此使用哈希可能会节省相当多的空间。
我最近遇到了一个非常相似的问题。起初我尝试将序列化的对象存储在 Redis DB 中,但我必须存储超过 500 万个对象,并且每个对象都包含很多我不需要存储在 DB 中的多余数据。这导致 DB 大小膨胀并浪费了大量 RAM。
您的要求可能与我的有所不同,因此最好自己进行基准测试。尝试序列化一个对象,看看结果有多大。将其与键总和的大小进行比较,并比较两者之间的大小差异。如果序列化的对象不大,最好只进行序列化。请记住,反序列化不是一个可以忽略的操作。
【解决方案2】:
字符串和哈希是非常不同的数据类型,它们都有优点和缺点。在你暴露的情况下,你错过了一些非常重要的事情;例如:
- 您打算多久编写一次密钥?
- 是否需要检索 100 个项目来聚合它们?在这种情况下,用聚合值存储散列是没有意义的,所以检索只进行一次?
- 这是重写入还是重读取应用程序?
- 您需要原子地编写吗?换句话说,2 个同时请求可以更新 Redis 中的相同值吗?如果是这样,您将如何保证存储 JSON 字符串不会导致竞争条件?
仅根据性能做出决定并不是一个好主意,您可能会遗漏一些其他重要方面,例如完整性、可扩展性和可维护性。