我在Redis上使用哈希存储对象,我想从Redis的角度计算这些哈希的长度。
您可以使用STRLEN
轻松地为字符串执行此操作。
但是我无法在documentation中找到适合哈希数据类型的命令。列表或集合似乎是一样的。
基本上,我找到的唯一解决方案是使用HGETALL
获取整个哈希并计算客户端大小的长度。
是完全开箱即用的东西吗?
如果我错了,请不要向我解释原因或给我相关链接/帖子/ SO问题。
修改:
HLEN不是解决方案,因为它“返回哈希中包含的字段数”。 我想计算容量规划&的这个大小。 Redis数据库上的Active Monitoring。
答案 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)
答案 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