KEYS es el comando prohibido por excelencia en producción, especialmente en Lua. No es un bug, es el comportamiento esperado. Cuando llamas a KEYS desde Lua, Redis bloquea el dataset completo mientras construye el array de resultados en memoria. Si tienes millones de keys, eso explota.
En redis-cli puede 'funcionar' porque no estás dentro de una transacción atómica de Lua. La solución: usa SCAN en lugar de KEYS, incluso dentro de scripts. Así:
local cursor = '0'
local keys = {}
repeat
local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1])
cursor = result[1]
for _, key in ipairs(result[2]) do
table.insert(keys, key)
end
until cursor == '0'Pero ojo: SCAN dentro de Lua pierde la garantía de atomicidad total. Es un trade-off.