Obtenga todas las claves en la base de datos de Redis con Python

Olorunfemi Akinlua 15 febrero 2024
  1. Use keys() para obtener todas las claves en la base de datos de Redis
  2. Utilice scan_iter() para obtener todas las claves en la base de datos de Redis
  3. Use zip_longest para obtener todas las claves en la base de datos de Redis
Obtenga todas las claves en la base de datos de Redis con Python

El sistema de diseño de Redis le resultará familiar si conoce JSON. Utiliza una estructura de clave-valor y un enfoque distribuido y en memoria para lograr una base de datos resistente.

Hashes, listas, conjuntos, conjuntos ordenados, cadenas, JSON y flujos son una de las muchas estructuras de datos que admite Redis. Esta base de datos de código abierto admite diferentes lenguajes, incluido Python, y si está desarrollando un sistema de back-end con ella, algunos módulos y paquetes ayudan con eso.

Una de las muchas operaciones que harías a menudo con las bases de datos es recuperar datos, y en una base de datos como Redis, las claves son importantes para lograr tal operación.

Este artículo discutirá cómo obtener todas las claves en una base de datos de Redis.

Use keys() para obtener todas las claves en la base de datos de Redis

Para hacer uso de redis, necesitamos tenerlo instalado; puede consultar la página de descarga de Redis para averiguar cómo hacerlo. Para usuarios de Linux y macOS, es bastante más fácil; sin embargo, para los usuarios de Windows, es posible que deba utilizar el Subsistema de Windows para Linux (WSL2), y puede seguir sus instrucciones guía de video.

Suponiendo que tiene configurada su base de datos de Redis, instalaremos el paquete redis, que proporciona acceso de cliente a la base de datos de Redis. Para instalarlo utilizaremos el comando pip.

pip install redis

Producción :

Collecting redis
  Downloading redis-4.3.4-py3-none-any.whl (246 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 246.2/246.2 kB 794.4 kB/s eta 0:00:00
Collecting deprecated>=1.2.3
  Downloading Deprecated-1.2.13-py2.py3-none-any.whl (9.6 kB)
Collecting async-timeout>=4.0.2
  Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)
Collecting packaging>=20.4
  Downloading packaging-21.3-py3-none-any.whl (40 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.8/40.8 kB 1.9 MB/s eta 0:00:00
Collecting wrapt<2,>=1.10
  Downloading wrapt-1.14.1-cp310-cp310-win_amd64.whl (35 kB)
Collecting pyparsing!=3.0.5,>=2.0.2
  Downloading pyparsing-3.0.9-py3-none-any.whl (98 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 98.3/98.3 kB 624.8 kB/s eta 0:00:00
Installing collected packages: wrapt, pyparsing, async-timeout, packaging, deprecated, redis
Successfully installed async-timeout-4.0.2 deprecated-1.2.13 packaging-21.3 pyparsing-3.0.9 redis-4.3.4 wrapt-1.14.1

Entonces, el paquete redis usa wrapt, pyparsing, async-timeout, packaging y módulos obsoletos para alimentar su módulo.

Para hacer uso del paquete redis, necesitamos importarlo.

import redis

Pasando al problema principal, podemos usar el método keys() proporcionado por el módulo redis para acceder y obtener todas las claves.

El método key() devuelve una lista de claves que coinciden con el patrón pasado dentro de sus argumentos desde una base de datos de Redis dada. Hay un patrón predeterminado si no se pasa ningún argumento, que es *, que significa todas las claves.

Para mostrar el método en funcionamiento, hemos rellenado manualmente la base de datos redis con el alias Temp con algunas claves utilizando el botón +Tecla o el siguiente código.

import redis

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

r = redis.StrictRedis(host=redisHost, port=redisPort, decode_responses=redisDecodeRes)

r.set("ConnectionPool", "Ox1212af34w3141")

El código anterior da como resultado que la clave ConnectionPool se agregue a la base de datos Temp con el valor correspondiente.

El método set() aplica el par clave-valor a la base de datos, y el método StrictRedis() crea un objeto de conexión Redis que nos da acceso a la base de datos.

Para mostrar la base de datos (con el alias Temp) y sus claves a través de una GUI, podemos usar la aplicación RedisInsight, como se ve en la imagen.

RedisInsight

Se han añadido manualmente un total de 11 claves a la base de datos para probar el método key().

Ahora, al método key(), tendremos que usar el método StrictRedis() para crear un objeto de conexión Redis para acceder a las claves. Los argumentos host, port y decode_responses se pasan para definir los parámetros de la conexión.

El host y el port definen el nombre de host y el número de puerto, y decode_responses define que los datos pasados se decodifican en cadenas de Python con las que podemos trabajar fácilmente. El método keys() luego accede a todas las claves disponibles ya que no se pasa ningún argumento.

import redis

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

r = redis.StrictRedis(
    host=redisHost, port=redisPort, decode_responses=redisDecodeRes, db=0
)

print(r.keys())

Producción :

['bar-two', 'information', 'bar-one', 'details', 'foo', 'jinku', 'bar', 'User-One', 'delft', 'bar-three', 'ConnectionPool']

Tenemos una lista de todas las claves en la base de datos Temp, con las que podemos trabajar.

Si tenemos un patrón clave que necesitamos, podemos pasarlo como argumento. Hagamos una lista de todas las teclas que comienzan con bar.

print(r.keys(pattern="bar*"))

Producción :

['bar-two', 'bar-one', 'bar', 'bar-three']

Utilice scan_iter() para obtener todas las claves en la base de datos de Redis

Con una gran base de datos, scan_iter() nos permite administrar mejor los datos dentro de nuestra aplicación Python. Además, el método key() bloquea el servidor e impide otras operaciones de uso, y con scan_iter(), su funcionamiento por lotes permite otras operaciones de uso.

Aunque keys() puede ser más rápido, no es bueno para múltiples sistemas basados en solicitudes.

Ahora, veámoslo en acción.

import redis

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

try:
    r = redis.StrictRedis(
        host=redisHost, port=redisPort, decode_responses=redisDecodeRes, db=0
    )
    for key in r.scan_iter(match="bar*"):
        print(key)
except Exception as e:
    print(e)

Producción :

bar-three
bar-one
bar-two
bar

El uso de try/except ayuda a lidiar con los problemas de conexión cuando tratamos de trabajar con la base de datos. Después de la conexión usando StrictRedis(), usamos el argumento match para definir el patrón de clave que estamos buscando y recorremos el resultado para dar la clave.

Use zip_longest para obtener todas las claves en la base de datos de Redis

Como dijimos, para bases de datos más grandes con muchas claves, el método scan_iter() es mejor, pero podemos mejorarlo aún más recuperando las claves en lotes de un número específico para administrar mejor el resultado.

Para crear el lote, necesitamos el módulo itertools que proporciona diferentes iteradores (o métodos) que se pueden usar para diferentes casos. Dentro del módulo itertools, tenemos el método zip_longest que devuelve un objeto zip_longest cuyo método .next() devuelve una tupla y agrega elementos del iterable que se le pasa.

Podemos usar el método zip_longest() para hacer una función que cree un lote de un número específico de claves dependiendo de los argumentos pasados. Por ejemplo, creamos un lote de 2, que se puede utilizar para muchos casos.

import redis
from itertools import zip_longest

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

try:
    r = redis.StrictRedis(
        host=redisHost, port=redisPort, decode_responses=redisDecodeRes, db=0
    )

    def batch(iterable, num):
        initIter = [iter(iterable)] * num
        return zip_longest(*initIter)

    for keyBatch in batch(r.scan_iter("bar*"), 2):
        print(keyBatch)
except Exception as e:
    print(e)

Producción :

('bar-three', 'bar-one')
('bar-two', 'bar')
Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn