Browse Source

Implement memory efficient stat convert

pull/2350/head
Igor Ippolitov 7 years ago
parent
commit
6de2193c68
  1. 32
      lualib/lua_stat.lua

32
lualib/lua_stat.lua

@ -45,29 +45,31 @@ local function convert_bayes_schema(redis_params, symbol_spam, symbol_ham, expi
-- KEYS[2]: hash key ('S' or 'H')
-- KEYS[3]: expire
local lua_script = [[
redis.replicate_commands()
local keys = redis.call('SMEMBERS', KEYS[1]..'_keys')
local nconverted = 0
for _,k in ipairs(keys) do
local elts = redis.call('HGETALL', k)
local cursor = redis.call('HSCAN', k, 0)
local neutral_prefix = string.gsub(k, KEYS[1], 'RS')
local real_key
for i,v in ipairs(elts) do
if i % 2 ~= 0 then
real_key = v
else
local nkey = string.format('%s_%s', neutral_prefix, real_key)
redis.call('HSET', nkey, KEYS[2], v)
if KEYS[3] and tonumber(KEYS[3]) > 0 then
redis.call('EXPIRE', nkey, KEYS[3])
local elts
while cursor[1] ~= "0" do
elts = cursor[2]
cursor = redis.call('HSCAN', k, cursor[1])
local real_key
for i,v in ipairs(elts) do
if i % 2 ~= 0 then
real_key = v
else
local nkey = string.format('%s_%s', neutral_prefix, real_key)
redis.call('HSET', nkey, KEYS[2], v)
if KEYS[3] and tonumber(KEYS[3]) > 0 then
redis.call('EXPIRE', nkey, KEYS[3])
end
nconverted = nconverted + 1
end
nconverted = nconverted + 1
end
end
end
return nconverted
]]

Loading…
Cancel
Save