我在 Redis 中存储了很多东西。其中一组带有命名空间cache
(键以 开头cache:
)。我想知道带有命名空间的数据/值的大小cache
。我可以在 Redis 中实现这一点吗?有什么建议么?
问问题
941 次
2 回答
1
您可以使用 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 函数的参数是要运行的键前缀。
于 2020-08-10T13:23:48.337 回答
0
您可以将扫描与内存使用命令一起使用。根据你的数据库的大小(你可以用 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_stack 在评论中指出的那样,当计数小于您的总密钥大小时,它不起作用,需要多次迭代。
于 2020-08-06T16:00:51.607 回答