如何获得带有前缀的redis键中的数据/值大小?

ybzsozfc  于 2021-06-10  发布在  Redis
关注(0)|答案(2)|浏览(558)

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

vc9ivgsu

vc9ivgsu1#

你可以用redisgears来做这个(https://oss.redislabs.com/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函数的参数是要在其上运行的键前缀。

5jdjgkvh

5jdjgkvh2#

您可以将scan与内存使用命令一起使用。根据数据库的大小(您可以用dbsize检查)-您可以安排 count 选择 scan 命令。下面的命令将扫描与 cache: 前缀。

SCAN 0 MATCH cache:* COUNT 2000

那你就可以执行了 MEMORY USAGE 在各个键上。你可以用你最喜欢的编程语言和可用的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\u stack在注解中指出的,当计数小于总密钥大小时,它将不起作用当计数小于时,它需要多次迭代。

相关问题