--[[******************************************************************************]] --[[* Project ib_win_core *]] --[[* Copyright 2023 Incredibuild Software Ltd. *]] --[[* All rights reserved *]] --[[******************************************************************************]] local select_items = function(DB0, DB1, cleanup_size, min_idle_time, sess_time, max_selected_items) cleanup_size = tonumber(cleanup_size) min_idle_time = tonumber(min_idle_time) max_selected_items = tonumber(max_selected_items) local selected_size = 0 local selected_items = {} redis.call('SELECT', DB1) local times = redis.call('KEYS', '*') table.sort(times) local keys_idletimes = {} for _,time in ipairs(times) do if time < sess_time then local cursor = '0' repeat local hscan cursor, hscan = unpack(redis.call('HSCAN', time, cursor)) for i=1,#hscan,2 do local key, val = string.sub(hscan[i], 1,32), string.sub(hscan[i], 33,64) local size = hscan[i+1] local idletime = keys_idletimes[key] if not idletime then redis.call('SELECT', DB0) idletime = redis.call('OBJECT', 'IDLETIME', key) redis.call('SELECT', DB1) keys_idletimes[key] = idletime end if not idletime or idletime > min_idle_time then selected_items[#selected_items + 1] = {k=key, v=val, t=time} selected_size = selected_size + size end if selected_size >= cleanup_size or #selected_items >= max_selected_items then return selected_size, selected_items end end until cursor == '0' else return selected_size, selected_items end end return selected_size, selected_items end local ok, selected_size, selected_items = pcall(select_items, unpack(ARGV)) if not ok then return '-1\n' .. selected_size end local cleanup_items = function(DB0, DB1) local list = {} for i,item in ipairs(selected_items) do redis.call('SELECT', DB0) redis.call('HDEL', item.k, item.v) redis.call('SELECT', DB1) redis.call('HDEL', item.t, item.k .. item.v) list[i] = item.k .. item.v end return table.concat(list, " ") end local ok, selected_list = pcall(cleanup_items, unpack(ARGV)) if not ok then return '-1\n' .. selected_list end return selected_size .. '\n' .. selected_list