Redis命令HMSET是否存在字段数量限制?

10
Redis命令HMSET的字段数有没有上限?如果我使用HMSET将100000个字段设置到一个键中,与将每个字段用作键相比,是否会导致性能问题?
答:Redis命令HMSET的字段数没有明确的上限。但是,由于Redis是单线程应用程序,将大量字段添加到一个键中可能会导致性能下降。相反,将每个字段用作键可以提高性能,并且易于维护和管理。
3个回答

10

它非常大,在64位系统中为2^64-1,在32位系统中为2^32-1, https://groups.google.com/d/msg/redis-db/eArHCH9kHKA/UFFRkp0iQ4UJ

1)每个Redis数据库中的键数:在64位系统中为2^64-1,在32位系统中为2^32-1。 每个哈希中的哈希字段数:在64位系统中为2^64-1,在32位系统中为2^32-1。

鉴于32位实例最多有4GB的可寻址空间,限制是无法达到的。对于64位实例,考虑到2^64-1有多大,限制是无法达到的。

因此,从实际角度考虑,只需考虑键和哈希受你拥有的RAM数量的限制。

Salvatore


10

我使用lua客户端进行了一些快速测试。

我尝试使用单个hmset命令,单独的hmset命令和管道化的单独命令存储100,000个字段,并计算它们完成所需的时间:

hmset 100000 fields: 3.164817

单独的hmset字段: 9.564578

管道化hmset命令: 4.784714

由于1,000,000+的值需要太长时间,因此我没有尝试更大的值,但是如果您想要自己调整代码,则可以在这里找到代码:https://gist.github.com/kraftman/1f15dc75649f07ee044eccab5379a8e3

根据应用程序,请记住当添加太多字段时会失去哈希的存储效率(“太多”可以设置,有关详细信息请参见这里)。


谢谢你的测试,不过我的场景是一个键和10000个字段。 - Jason
我猜我使用了错误的术语:我设置了一个名为“newhash”的键,有100,000个字段,我会编辑我的答案。 - Chris Tanner

3
根据Redis文档,没有这样的限制。
实际上,你可以在哈希表中放置的字段数量没有实际限制(除了可用内存)。
我认为,在HASH中保存数据不会有性能惩罚。然而,如果你有一个非常大的HASH,调用HGETALL总是一个坏主意。因为HGETALL返回HASH的所有字段和值,当HASH非常大时,这会导致Redis实例长时间阻塞。 HASH是否比键值存储更好,很大程度上取决于您的场景。

那么对于10万个键值对,与一个键和10万个字段的哈希相比,性能几乎相同吗? - Jason
@Jason 是的,性能几乎相同。理论上来说,HASH可能会更慢,因为Redis需要先搜索键索引,然后搜索HASH的字段索引(2个索引搜索VS 1个索引搜索)。但是,索引搜索非常非常快,您可以忽略差异。我曾经进行过类似的测试,性能几乎相同。 - for_stack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接