【问题标题】:How to get Redis Hash Length?如何获取 Redis 哈希长度?
【发布时间】:2013-05-17 12:02:34
【问题描述】:

我在 Redis 上使用哈希存储对象,我想从 Redis 的角度计算这些哈希的长度。

您可以使用STRLEN 轻松对字符串执行此操作。

但我根本无法在documentation 中找到适合哈希数据类型的命令。列表或集合似乎是一样的。

基本上,我发现的唯一解决方案是使用HGETALL 获取整个哈希并计算客户端大小的长度。

是完全开箱即用的东西吗?

如果我错了,请不要向我解释原因或给我相关的链接/帖子/SO问题。

编辑

HLEN 不是解决方案,因为它“返回哈希中包含的字段数”。 我想为 Redis 数据库上的容量规划和主动监控计算这个大小。

【问题讨论】:

  • 你能解释一下你为什么想要这个吗?是估计redis上的内存使用量吗?还是您需要实现特定功能?有多种方法可以找到length of hash from redis' point of view,但根据您的用例,它可能有用也可能没用。
  • @Cyber​​maxs 你最后做了什么?

标签: redis


【解决方案1】:

只需使用HLEN

redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HLEN myhash
(integer) 2

编辑: 问题被澄清为 OP 希望磁盘上的散列大小用于主动监控。在这种情况下,我肯定会使用 Lua 脚本来计算服务器上散列的大小并将值返回给您。 不要使用 HGETALL 如果您期望大哈希,因为您需要将整个哈希从您的服务器传输到您的客户端计算机,这将很快成为您的瓶颈。只需使用 Lua 在 Redis 服务器上进行此计算,就意味着您只需传输网络字节数的整数,而不是整个哈希的可能 mb 数据。

【讨论】:

  • 正如我之前所说,HLEN 只返回哈希的字段数
  • @Cyber​​maxs-Betclic 您从未在帖子中的任何地方提及 HLEN。哈希的长度是字段(键)的数量。如果不是那个,你指的是什么长度?在任何其他语言中,当您执行 len(hash) 之类的操作时,这就是您期望返回的结果。
  • 哦,这是真的。 HLEN "返回存储在 key 的哈希中包含的字段数" ;不是长度,或者如果您更喜欢整个哈希的大小。
  • @Cyber​​maxs-Betclic 我认为这里存在根本性的误解。 Redis 在数据库中有指向特定数据结构的键。在您的情况下,Redis 键指向您的哈希(由许多指向值的哈希键组成)。 HLEN 确实为您提供了散列的长度(散列中的键数)。在我看来,这仍然是您所要求的。如果您实际要求的是哈希磁盘上的大小,我已经在上面编辑了我的答案。
【解决方案2】:

对于磁盘空间的长度,您可以使用DEBUG OBJECT,因为它会为每个键返回多个信息项。

redis 127.0.0.1:50001> hset myhash field1 'hello'
(integer) 1
redis 127.0.0.1:50001> hset myhash field2 'world'
(integer) 1
redis 127.0.0.1:50001> DEBUG OBJECT myhash
Value at:0x7fb8de4ad590 refcount:1 encoding:zipmap serializedlength:31 lru:696871 lru_seconds_idle:0

希望对你有帮助

【讨论】:

  • 那么该对象占用了多少字节?我不明白serialized length31?
  • 您实际上并没有回答 OP 的问题。多少字节?
【解决方案3】:

取决于你想对哈希的长度做什么。

如果您希望对长度进行一些诊断或监控,例如查找消耗的内存,那么我建议您使用redis-rdb-tools 之类的工具离线进行(免责声明:我是此工具的作者)。 csv 转储文件将为您提供有关每个键的统计信息 - 包括总大小、消耗的总内存等。

但如果您希望尺寸实现某些应用程序功能,则没有现成的解决方案。 HGETALL 加上客户端大小计算长度是要走的路。您也许可以通过编写一个 lua 脚本进行优化,以便在 redis 服务器本身上进行长度计算。

【讨论】:

  • 投反对票 - 你能留下评论为什么这被投反对票吗?我不介意投反对票,但很想知道我错过了什么或陈述不正确:)
  • 我没有对你投反对票,而是对你的伟大工具 redis-rdb-tools 投了赞成票。
  • @SripathiKrishnan 我投了反对票,因为“如何获得 redis 哈希长度”的明显答案是 HLEN,但显然 OP 在他的问题中的意思不是哈希的“长度”,所以你的答案其实很好。我会删除反对票,但除非你以某种方式编辑你的答案,否则我不会再让我这么做了。如果你这样做,我很乐意删除它:)。
  • @Eli 不用担心,我不介意。感谢您发表评论,这是第一次有人努力解释投反对票!
【解决方案4】:

使用MEMORY USAGE 命令。

127.0.0.1:6379> hmset user:1000 username antirez birthyear 1977 verified 1 
OK
127.0.0.1:6379> memory usage user:1000 
(integer) 110

当您将其用于容量规划时,此命令的优点是包括 redis 在数据本身大小之上增加的任何管理开销。

127.0.0.1:6379> SET "" ""
OK
127.0.0.1:6379> MEMORY USAGE ""
(integer) 46

【讨论】:

    【解决方案5】:

    您最好的选择是在遇到哈希时使用HSCAN 来获取字段并为每个字段总结HSTRLEN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      相关资源
      最近更新 更多