如何在lua脚本中找到特定的redis密钥内存大小

时间:2015-07-08 11:04:57

标签: 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_b003d960240545d9540ebc2319d863221045 3815):从Lua脚本调用Redis命令的args数量错误

1 个答案:

答案 0 :(得分:2)

DEBUG OBJECT is not a good bet。它显示了值的序列化长度,因此它只是存储在RDB文件中的对象大小。

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

  1. TYPE
  2. OBJECT ENCODING
  3. 获取其长度的特定于对象类型的命令。
  4. 采样一些元素以了解对象的平均字符串长度。
  5. 基于这四个信息,您需要检查Redis源代码以检查所使用的内部结构的不同内存占用量,并进行数学运算。不容易......

    更可行的近似就是使用:

    APPROX_USED_MEM = num_elements * avg_size * overhead_factor

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

    TLDR:您要做的事情很复杂并导致错误。在未来,我们的想法是提供一个能够执行此操作的MEMORY命令。