如何获得Redis哈希长度?

时间:2013-05-22 12:26:11

标签: redis

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

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

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

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

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

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

修改

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

5 个答案:

答案 0 :(得分:23)

只需使用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服务器上执行此计算意味着您只需传输网络中字节数的int,而不是整个哈希值的mb数据。

答案 1 :(得分:8)

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

希望有所帮助

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

使用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
相关问题