我在redis里存了很多东西。其中一组具有命名空间 cache (键以开头) cache: ). 我想知道命名空间中数据/值的大小 cache . 我能在redis实现这一点吗?有什么建议吗?
cache
cache:
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函数的参数是要在其上运行的键前缀。
5jdjgkvh2#
您可以将scan与内存使用命令一起使用。根据数据库的大小(您可以用dbsize检查)-您可以安排 count 选择 scan 命令。下面的命令将扫描与 cache: 前缀。
count
scan
SCAN 0 MATCH cache:* COUNT 2000
那你就可以执行了 MEMORY USAGE 在各个键上。你可以用你最喜欢的编程语言和可用的redis库来实现它。lua的例子可以是这样的(我对lua没有足够的经验,但它看起来很有用)。它将返回值的总大小(以字节为单位)。
MEMORY USAGE
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在注解中指出的,当计数小于总密钥大小时,它将不起作用当计数小于时,它需要多次迭代。
2条答案
按热度按时间vc9ivgsu1#
你可以用redisgears来做这个(https://oss.redislabs.com/redisgears/)只有一行:
第一个map操作获取每个键的大小,聚合操作对其求和。run函数的参数是要在其上运行的键前缀。
5jdjgkvh2#
您可以将scan与内存使用命令一起使用。根据数据库的大小(您可以用dbsize检查)-您可以安排
count
选择scan
命令。下面的命令将扫描与cache:
前缀。那你就可以执行了
MEMORY USAGE
在各个键上。你可以用你最喜欢的编程语言和可用的redis库来实现它。lua的例子可以是这样的(我对lua没有足够的经验,但它看起来很有用)。它将返回值的总大小(以字节为单位)。
它可能不是大型数据库的最佳“性能”解决方案。您可能需要更新光标。
编辑:正如@for\u stack在注解中指出的,当计数小于总密钥大小时,它将不起作用当计数小于时,它需要多次迭代。