Skip to content

Instantly share code, notes, and snippets.

@TonyStarkBy
Last active May 13, 2020 08:51
Show Gist options
  • Save TonyStarkBy/28a781eb3c9f0c2a7e1f to your computer and use it in GitHub Desktop.
Save TonyStarkBy/28a781eb3c9f0c2a7e1f to your computer and use it in GitHub Desktop.
redis: delete keys by idle time
-- how to use:
-- redis-cli EVAL "$(cat redis-idle-clean.lua)" 2 key_name 86400
local keyTemplate = KEYS[1]
local keyMinIdleTime = tonumber(KEYS[2])
local function getUsedMemory()
local info = redis.call('info')
for i in string.gmatch(info, "%S+") do
local key,val = string.match(i, '(%S+):(%d+)')
if (key == 'used_memory') then
return tonumber(val)
end
end
return -1
end
local matches = redis.call('KEYS', keyTemplate .. '*')
local deleted = 0
local usedMemoryBefore = getUsedMemory()
for _,key in ipairs(matches) do
local idle = redis.call('OBJECT', 'IDLETIME', key)
if (idle > keyMinIdleTime) then
redis.call('DEL', key)
deleted = deleted + 1
end
end
local memoryFreed = usedMemoryBefore - getUsedMemory()
local result = {
"Total keys: " .. table.getn(matches),
"Deleted keys: " .. deleted,
"Memory freed: " .. memoryFreed
}
return result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment