Cómo gestionar bases de datos y claves de Redis

Introducción

Redis es un almacén de datos de clave-valor en memoria de código abierto. Un almacén de datos de clave-valor es un tipo de base de datos NoSQL en la que las claves sirven como identificadores únicos para sus valores asociados. Cada instancia de Redis incluye varios bases de datos, cada una de las cuales puede contener muchas claves diferentes de una variedad de tipos de datos.

En este tutorial, aprenderás cómo seleccionar una base de datos, mover claves entre bases de datos, y gestionar y eliminar claves.

Cómo Usar Esta Guía

Esta guía está escrita como una hoja de trucos con ejemplos autocontenidos. Te animamos a ir a cualquier sección que sea relevante para la tarea que estés intentando completar.

Los comandos mostrados en esta guía fueron probados en un servidor Ubuntu 22.04 ejecutando Redis versión 6.0.16. Para configurar un entorno similar, puedes seguir Paso 1 de nuestra guía sobre Cómo Instalar y Asegurar Redis en Ubuntu 22.04. Demonstraremos cómo se comportan estos comandos ejecutándolos con redis-cli, la interfaz de línea de comandos de Redis. Ten en cuenta que si estás utilizando una interfaz diferente de Redis, como Redli, por ejemplo, la salida exacta de ciertos comandos puede variar.

Alternativamente, podrías aprovisionar una instancia de base de datos Redis gestionada para probar estos comandos, pero dependiendo del nivel de control permitido por tu proveedor de base de datos, algunos comandos en esta guía pueden no funcionar como se describe. Para aprovisionar una base de datos gestionada de DigitalOcean, sigue nuestra documentación del producto de Bases de Datos Gestionadas. Luego, debes instalar Redli o configurar un túnel TLS para conectarte a la base de datos gestionada a través de TLS.

Gestión de Bases de Datos

Fuera de la caja, una instancia de Redis admite 16 bases de datos lógicas. Estas bases de datos están efectivamente aisladas entre sí, y cuando ejecutas un comando en una base de datos, no afecta a los datos almacenados en otras bases de datos de tu instancia de Redis.

Las bases de datos de Redis están numeradas del 0 al 15 y, por defecto, te conectas a la base de datos 0 cuando te conectas a tu instancia de Redis. Sin embargo, puedes cambiar la base de datos que estás utilizando con el comando select después de la conexión:

  1. select 15

Si has seleccionado una base de datos diferente a la 0, se reflejará en el indicador de comando redis-cli:

Para intercambiar todos los datos de una base de datos con los datos de otra, utiliza el comando swapdb. El siguiente ejemplo intercambiará los datos de la base de datos 6 con la de la base de datos 8, y cualquier cliente conectado a cualquiera de las bases de datos podrá implementar cambios inmediatamente:

  1. swapdb 6 8

swapdb devolverá OK si el intercambio es exitoso.

Si deseas mover una clave a una instancia diferente de Redis, puedes ejecutar migrate. Este comando asegura que la clave exista en la instancia de destino antes de eliminarla de la instancia de origen. Cuando ejecutas migrate, el comando debe incluir los siguientes elementos en este orden:

  • El nombre de host o la dirección IP de la base de datos de destino
  • El número de puerto de la base de datos de destino
  • El nombre de la clave que deseas migrar
  • El número de base de datos donde deseas almacenar la clave en la instancia de destino
  • A timeout, in milliseconds, which defines the maximum amount of idle communication time between the two machines. Note that this isn’t a time limit for the operation, but means that the operation should always make some level of progress within the defined length of time

Para ilustrar, aquí tienes un ejemplo:

  1. migrate 203.0.113.0 6379 key_1 7 8000

Además, migrate permite las siguientes opciones que puedes agregar después del argumento de tiempo de espera:

  • COPY: Especifica que la clave no debe ser eliminada de la instancia de origen
  • REPLACE: Especifica que si la clave ya existe en el destino, la operación de migrate debe eliminarla y reemplazarla
  • KEYS: En lugar de proporcionar una clave específica para migrar, puedes ingresar una cadena vacía ("") y luego usar la sintaxis del comando keys para migrar cualquier clave que coincida con un patrón. Para obtener más información sobre cómo funciona keys, lee nuestro tutorial sobre Cómo Solucionar Problemas en Redis.

Gestión de Claves

Existen varios comandos de Redis que son útiles para gestionar claves, independientemente del tipo de datos que contengan. Algunos de estos comandos se revisan en la siguiente sección.

rename renombrará la clave especificada. Si tiene éxito, devolverá OK:

  1. rename old_key new_key

Puedes usar randomkey para devolver una clave aleatoria de la base de datos seleccionada actualmente:

  1. randomkey
Output
"any_key"

Utilice type para determinar qué tipo de datos contiene la clave proporcionada. La salida de este comando puede ser string, list, hash, set, zset o stream:

  1. type key_1
Output
"string"

Si la clave especificada no existe, type devolverá none en su lugar.

Puede mover una clave individual a otra base de datos en su instancia de Redis con el comando move. move toma el nombre de una clave y la base de datos a la que desea mover la clave como argumentos. Por ejemplo, para mover la clave key_1 a la base de datos 8, ejecutaría lo siguiente:

  1. move key_1 8

move devolverá OK si la clave se movió correctamente.

Eliminación de Claves

Para eliminar una o más claves de cualquier tipo de datos, use el comando del seguido de una o más claves que desee eliminar:

  1. del key_1 key_2

Si este comando elimina la(s) clave(s) correctamente, devolverá (integer) 1. De lo contrario, devolverá (integer) 0.

El comando unlink realiza una función similar a del, con la diferencia de que del bloquea al cliente mientras el servidor recupera la memoria ocupada por la clave. Si la clave que se está eliminando está asociada con un objeto pequeño, el tiempo que tarda del en recuperar la memoria es muy corto y el tiempo de bloqueo ni siquiera puede ser perceptible.

Sin embargo, puede volverse incómodo si, por ejemplo, la clave que estás eliminando está asociada con muchos objetos, como un hash con miles o millones de campos. Eliminar una clave así puede llevar bastante tiempo y te bloqueará de realizar otras operaciones hasta que se elimine por completo de la memoria del servidor.

unlink, sin embargo, primero determina el costo de desasignar la memoria ocupada por la clave. Si es pequeño, entonces unlink funciona de la misma manera que del eliminando la clave inmediatamente y bloqueando al cliente. Sin embargo, si hay un alto costo para desasignar memoria para una clave, unlink eliminará la clave de manera asíncrona creando otro hilo y recuperando la memoria incrementalmente en segundo plano sin bloquear al cliente:

  1. unlink key_1

Dado que se ejecuta en segundo plano, generalmente se recomienda que uses unlink para eliminar claves de tu servidor y así reducir errores en tus clientes, aunque del también será suficiente en muchos casos.

Advertencia: Los siguientes dos comandos se consideran peligrosos. Los comandos flushdb y flushall eliminarán de forma irreversible todas las claves en una sola base de datos y todas las claves en todas las bases de datos del servidor de Redis, respectivamente. Se recomienda que solo ejecutes estos comandos si estás absolutamente seguro de que deseas eliminar todas las claves de tu base de datos o servidor.

Puede ser de su interés renombrar estos comandos a algo con menor probabilidad de ser ejecutado accidentalmente.

Para eliminar todas las claves en la base de datos seleccionada, utilice el comando flushdb:

  1. flushdb

Para eliminar todas las claves en cada base de datos en un servidor Redis (incluida la base de datos actualmente seleccionada), ejecute flushall:

  1. flushall

Ambos flushdb y flushall aceptan la opción async, que le permite eliminar todas las claves en una sola base de datos o en cada base de datos de forma asíncrona. Esto les permite funcionar de manera similar al comando unlink, y crearán un nuevo hilo para liberar progresivamente memoria en segundo plano.

Haciendo una Copia de Seguridad de su Base de Datos

Para crear una copia de seguridad de la base de datos actualmente seleccionada, puede usar el comando save:

  1. save

Esto exportará una instantánea del conjunto de datos actual como un archivo .rdb, que es un archivo de volcado de la base de datos que contiene los datos en un formato de serialización interno comprimido.

save se ejecuta de forma síncrona y bloqueará a cualquier otro cliente conectado a la base de datos. Por lo tanto, la documentación del comando save recomienda que este comando casi nunca se ejecute en un entorno de producción. En su lugar, sugiere usar el comando bgsave. Esto le indica a Redis que bifurque la base de datos: el proceso padre continuará sirviendo a los clientes mientras que el proceso hijo guarda la base de datos antes de salir:

  1. bgsave

Ten en cuenta que si los clientes agregan o modifican datos mientras ocurre la operación bgsave, estos cambios no se capturarán en la instantánea.

También puedes editar el archivo de configuración de Redis para que Redis guarde automáticamente una instantánea (conocida como snapshotting o modo RDB) después de cierto tiempo si se realizó un número mínimo de cambios en la base de datos. Esto se conoce como un punto de guardado. Los siguientes ajustes de puntos de guardado están habilitados de forma predeterminada en el archivo redis.conf:

/etc/redis/redis.conf
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .

Con estos ajustes, Redis exportará una instantánea de la base de datos al archivo definido por el parámetro dbfilename cada 900 segundos si al menos una clave cambió, cada 300 segundos si al menos 10 claves cambiaron, y cada 60 segundos si al menos 10000 claves cambiaron.

Puedes usar el comando shutdown para hacer una copia de seguridad de tus datos de Redis y luego cerrar tu conexión. Este comando bloqueará a cada cliente conectado a la base de datos y luego realizará una operación save si al menos se configuró un punto de guardado, lo que significa que exportará la base de datos en su estado actual a un archivo .rdb mientras evita que los clientes realicen cambios.

Además, el comando shutdown ​​flushear los cambios al archivo de registro de Redis antes de salir si se habilita el modo append-only. El modo archivo de registro solo de adiciones (AOF) implica crear un registro de cada operación de escritura en el servidor en un archivo que termina en .aof después de cada instantánea. Los modos AOF y RDB pueden estar habilitados en el mismo servidor, y utilizar ambos métodos de persistencia es una forma efectiva de hacer una copia de seguridad de sus datos.

En resumen, el comando shutdown es esencialmente un comando de bloqueo save que también flushea todos los cambios recientes al archivo de registro de adiciones y cierra la conexión con la instancia de Redis:

Advertencia: El comando shutdown se considera peligroso. Al bloquear a los clientes del servidor de Redis, puede hacer que sus datos no estén disponibles para los usuarios y aplicaciones que dependen de ellos. Se recomienda que solo ejecute este comando si está probando el comportamiento de Redis o si está absolutamente seguro de que desea bloquear a todos los clientes del servidor de Redis.

De hecho, puede ser de su interés renombrar este comando a algo con una menor probabilidad de ser ejecutado accidentalmente.

  1. shutdown

Si no ha configurado ningún punto de guardado pero aún desea que Redis realice una operación save, agregue la opción save al comando shutdown:

  1. shutdown save

Si has configurado al menos un punto de guardado pero deseas apagar el servidor Redis sin realizar un guardado, puedes agregar el argumento nosave al comando:

  1. shutdown nosave

Ten en cuenta que el archivo de registro sólo de añadidos puede crecer mucho con el tiempo, pero puedes configurar Redis para reescribir el archivo en función de ciertas variables editando el archivo redis.conf. También puedes instruir a Redis para que reescriba el archivo de registro solo de añadidos ejecutando el comando bgrewriteaof:

  1. bgrewriteaof

bgrewriteaof creará el conjunto más corto de comandos necesarios para devolver la base de datos a su estado actual. Como su nombre indica, este comando se ejecutará en segundo plano. Sin embargo, si otro comando de persistencia ya está en ejecución en segundo plano, ese comando debe finalizar antes de que Redis ejecute bgrewriteaof.

Conclusión

Esta guía detalla una serie de comandos utilizados para gestionar bases de datos y claves. Si hay otros comandos, argumentos o procedimientos relacionados que te gustaría aprender en esta guía, por favor pregunta o haz sugerencias en los comentarios.

Para obtener más información sobre los comandos de Redis, consulta nuestra serie de tutoriales sobre Cómo Gestionar una Base de Datos Redis.

Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys