1

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

4

2 回答 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 回答