如何在Lua脚本中查找特定的Redis键的内存大小

redis.call('select', '14')

local allKeys = redis.call('keys', 'orgId#1:logs:email:uid#*')

for i = 1, #allKeys, 1 do
    local object11 = redis.call('DEBUG OBJECT', allKeys[i])
    print("kk", object11[1])
end

在这里,“DEBUG OBJECT”在redis-cli上成功运行,但如果我们想通过lua脚本在多个键上运行,则会发送此错误。

(错误)ERR运行脚本时出错(调用f_b003d960240545d9540ebc2319d8632210453815的命令Redis命令的参数数量不正确)。

点赞
用户130155
用户130155

DEBUG OBJECT不是一个好的选择。它展示的是值的序列化长度,因此仅仅是对象存储在RDB文件上的大小。

为了对Redis中的对象大小有一些提示,您需要采用更复杂的技术,但您只能得到一个近似值。您需要运行:

  1. TYPE
  2. OBJECT ENCODING
  3. 特定于对象类型的命令以获得其长度。
  4. 采样几个元素以了解对象的平均字符串长度。

基于这四个信息,您需要检查Redis源代码以检查使用的内部结构的不同内存占用情况,并进行计算。这并不容易...

一个更可行的逼近值是只使用:

APPROX_USED_MEM = num_elements * avg_size * overhead_factor

您可能希望选择一个对各种数据类型都有意义的开销因子。误差很大,但对于某些用例来说,这是足够好的逼近值。也许overhead_factor可能是2之类的东西。

TLDR:您正在尝试的是复杂的操作,并且容易出错。未来的想法是提供一个能够完成此操作的MEMORY命令。

2015-07-08 14:01:20