Introducción
Rb es una biblioteca de Python que facilita el sharding no replicado en Redis. Construida sobre python-redis, introduce un sistema de enrutamiento personalizado que distribuye automáticamente los comandos a diferentes nodos sin necesidad de gestión manual. Aunque no cubre todas las funcionalidades de Redis, es ideal para operaciones clave-valor que pueden ser enrutadas de manera eficiente.
Instalación
La biblioteca está disponible en PyPI y se instala mediante pip:
$ pip install rb
Configuarción
Para configurar un clúster, se define un conjunto de nodos en lugar de un único host. Aquí un ejemplo con hosts en localhost pero diferentes puertos:
from rb import Cluster
redis_cluster = Cluster(hosts={
'nodo_a': {'port': 6380},
'nodo_b': {'port': 6381},
'nodo_c': {'port': 6382},
'nodo_d': {'port': 6383},
}, host_defaults={'host': '127.0.0.1'})
El parámetro hosts mapea identificadores de host a configuraciones, mientras que host_defaults proporciona valores comunes. Por defecto, se utiliza el PartitionRouter para el enrutamiento.
Enrutamiento de Operaciones
Se puede obtener un cliente con enrutamiento automático usando get_routing_client. Este cliente redirige comandos a nodos específicos basándose en la clave:
cliente_ruta = redis_cluster.get_routing_client()
valores = {}
for id_clave in lista_claves:
valores[id_clave] = cliente_ruta.get(id_clave)
Para ejecutar operaciones en paralelo, se emplea el contexto map, que agrupa comandos y los envía concurrentemente. Los resultados se almacenan como objetos Promise:
resultados_mapa = {}
with redis_cluster.map() as cliente_map:
for item in datos:
resultados_mapa[item] = cliente_map.get(item)
for clave, promesa in resultados_mapa.items():
print(f'{clave}: {promesa.value}')
Comandos a Todos los Nodos
Para operaciones globales, como limpiar bases de datos, se utiliza all:
with redis_cluster.all() as cliente_global:
cliente_global.flushdb()
El resultado es un diccionario con el ID de host como clave y el valor correspondiente. Para enviar comandos a hosts específicos, se usa fanout:
with redis_cluster.fanout(hosts=['nodo_a', 'nodo_b']) as cliente_fan:
info_nodos = cliente_fan.info()
Resumen de la API
La biblioteca expone varias clases clave:
- Cluster: Gestiona el clúster y sus pools de conexión. Ofrece métodos como
get_routing_client,map, yall. - RoutingClient: Enruta comandos a nodos individuales, con soporte para batching automático.
- MappingClient: Permite operaciones paralelas y devuelve promesas que se resuelven al finalizar el contexto.
- FanoutClient: Envía comandos a hosts específicos manualmente, útil para tareas administrativas.
Los routers disponibles incluyen PartitionRouter (usa crc32 para asignar claves) y ConsistentHashingRouter (basado en hashing consistente). Para pruebas, se puede usar make_test_cluster para generar clústeres temporales.