¿Borrar claves Redis por patrón? Ojo con la estrategia y la performance

Cuando necesitas borrar claves de Redis que siguen un patrón, hay dos enfoques principales que puedes considerar. La elección correcta depende si buscas una eliminación inmediata y atómica o una estrategia de gestión de datos a largo plazo.

Cuando necesitas borrar claves de Redis que siguen un patrón, veo que se discuten dos enfoques principales. Cada uno tiene su lugar y es importante entender la diferencia.

1. Estrategia de prefijos: una 'eliminación' lógica

Este método es más una estrategia de arquitectura de datos que una eliminación directa. La idea es cambiar el prefijo que usas para tus claves.

Si tu aplicación antes usaba claves como prefix:2:id, ahora la actualizas para que escriba con prefix:3:id. Las claves antiguas con prefix:2:* quedan obsoletas, pero no se borran de inmediato.

Por ejemplo:

prefix_actual = 2
prefix:2:1 = 4
prefix:2:2 = 10

Cuando quieres 'purga', cambias prefix_actual a 3. Tu aplicación ahora escribe en prefix:3:1. Las claves antiguas, como prefix:2:1, puedes borrarlas en un proceso aparte, quizá cuando ya no las necesites o cuando expire su TTL.

Esto no borra las claves al instante, solo las deja de usar. Sirve si necesitas mantener un historial o si la eliminación no es urgente. Para la limpieza final, la gente suele usar un comando como este, aunque tiene sus riesgos:

redis-cli KEYS "prefix:2:*" | xargs redis-cli DEL

2. Eliminación atómica con scripts Lua

Si tu necesidad es borrar claves existentes de forma atómica y directa, un script Lua es la opción. Redis ejecuta los scripts Lua de forma atómica, sin interrupciones, lo cual es crucial para la integridad de los datos.

Un script Lua para esto podría verse así:

EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 prefix:tu_patron:*

El problema con KEYS en producción

Aquí es donde hay que tener cuidado. El script anterior usa el comando KEYS. Y ojo que KEYS no es para usar en producción con datasets grandes.

KEYS escanea todas las claves en tu instancia de Redis, bloqueándola por completo mientras lo hace. Si tienes millones de claves, esto te va a generar latencia brutal y problemas de performance serios. Es útil para desarrollo o para entornos con un número de claves muy limitado, pero no más allá.

La solución robusta: SCAN en Lua

Para producción, la forma correcta de borrar claves por patrón de forma atómica es usando SCAN dentro de un script Lua. SCAN te permite iterar las claves en bloques sin bloquear el servidor. Es más complejo de implementar porque necesitas manejar el cursor y la iteración, de hecho, esto me costó entenderlo bien al principio, la tentación de KEYS es grande.

Un script Lua con SCAN es más largo y complejo, pero es la herramienta adecuada para un borrado seguro en ambientes productivos. Te asegura que no vas a degradar la performance de tu Redis.

Mi opinión y advertencia

Personalmente, si la necesidad es borrar claves por patrón de forma atómica en producción, el script Lua con SCAN es el camino a seguir. La estrategia de prefijos es útil para gestionar versiones de datos o separación lógica, pero no resuelve el borrado inmediato y atómico de claves existentes.

El error más común que veo es usar KEYS en producción porque es 'más fácil'. No lo hagas. Te va a generar dolores de cabeza cuando menos lo esperes. Invierte tiempo en entender y usar SCAN o en diseñar bien tu estrategia de prefijos si eso es lo que realmente necesitas.

Jorge RequenaDeveloper full-stack · Chile