如何在带有前缀的Redis密钥中获取数据/值大小?

如何在带有前缀的Redis密钥中获取数据/值大小?,redis,redisgears,Redis,Redisgears,我在Redis里储存了很多东西。其中一组具有命名空间缓存(键以缓存开始:)。我想知道命名空间为缓存的数据/值的大小。我可以在Redis中实现这一点吗?有什么建议吗?您可以与命令一起使用。根据数据库的大小(您可以使用DBSIZE进行检查)-您可以安排scan命令的count选项。以下命令将扫描与缓存匹配的数据库:前缀 SCAN 0 MATCH cache:* COUNT 2000 然后您可以对各个键执行内存使用。您可以使用可用的redis库,用您最喜欢的编程语言实现它 lua的例子可能是这样的(

我在Redis里储存了很多东西。其中一组具有命名空间
缓存
(键以
缓存开始:
)。我想知道命名空间为
缓存的数据/值的大小。我可以在Redis中实现这一点吗?有什么建议吗?

您可以与命令一起使用。根据数据库的大小(您可以使用DBSIZE进行检查)-您可以安排
scan
命令的
count
选项。以下命令将扫描与
缓存匹配的数据库:
前缀

SCAN 0 MATCH cache:* COUNT 2000
然后您可以对各个键执行
内存使用
。您可以使用可用的redis库,用您最喜欢的编程语言实现它

lua的例子可能是这样的(我没有足够的lua经验,但它看起来很有效)。它将以字节为单位返回值的总大小

local response = redis.call("SCAN", 0, "MATCH", "cache:*", "count", 2000)
local keys = response[2]
local total = 0

for i = 1, #keys do
    total = total + redis.call("MEMORY", "USAGE", keys[i])
end

return total
它可能不是大型数据库的最佳“性能”解决方案。您可能需要更新光标

编辑:
正如@for_stack在注释中指出的,当计数小于总密钥大小时,它将不起作用。当计数小于时,它需要迭代多次。

您可以使用RedisGears()通过一行完成此操作:

RG.PYEXECUTE "GB().map(lambda x: int(execute('MEMORY', 'USAGE', x['key']))).aggregate(0, lambda a,x: a+x, lambda a,x: a+x).run('cache:*')"

第一个map操作获取每个键的大小,聚合操作对其求和。run函数的参数是要运行的键前缀。

Lua脚本中存在缺陷。为了获得所有匹配的键,您需要反复调用
SCAN
,直到返回的光标为0。但是,您不能扫描脚本中的所有键,否则Redis将被阻止。因此,更好的解决方案可能是将游标作为参数传递给脚本。@对于_stack,谢谢您的评论,您是对的(我在回答中写道,它可能适用于少量的总键)。