11

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

您可以使用STRLEN.

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

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

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

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

编辑

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

4

5 回答 5

31

只需使用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 数据。

于 2013-05-22T19:17:02.897 回答
10

对于作为磁盘空间的长度,您可以使用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

希望能帮助到你

于 2014-01-30T13:38:04.387 回答
5

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

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

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

于 2013-05-22T14:42:54.140 回答
1

使用内存使用命令。

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
于 2020-01-23T00:52:09.163 回答
0

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

于 2017-08-24T03:11:03.373 回答