Cliente Redis en Rust: guía completa para trabajar con la biblioteca redis-rs

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Biblioteca redis-rs: Cliente Rust para Redis

\n\n

redis-rs es la biblioteca principal, madura y más popular para trabajar con Redis desde el lenguaje Rust. Proporciona una API tanto síncrona como asíncrona (basada en tokio o async-std), admite agrupación en clúster, pipelines, Pub/Sub, transacciones y scripts Lua. La biblioteca se caracteriza por su alto rendimiento, seguridad de tipos y ergonomía, propias del ecosistema Rust.

\n\n

Instalación y conexión

\n\n

Añada la dependencia en Cargo.toml:

\n\n
[dependencies]\nredis = { version = "0.25", features = ["tokio-comp"] }  # para async con tokio\n# o\nredis = "0.25"  # solo modo síncrono
\n\n

Conexión básica a Redis (variante síncrona):

\n\n
use redis::Commands;\n\nfn main() -> redis::RedisResult<()> {\n    let client = redis::Client::open("redis://127.0.0.1:6379/")?;\n    let mut con = client.get_connection()?;\n\n    // Establecer y obtener valor\n    con.set("key", "value")?;\n    let val: String = con.get("key")?;\n    println!("Obtenido: {}", val);\n\n    Ok(())\n}
\n\n

Funcionalidades principales

\n\n

1. Comandos tipados

\n

La biblioteca convierte automáticamente los tipos de Rust a tipos de Redis y viceversa. Admite cadenas, números, tuplas, vectores, así como tipos personalizados a través del trait FromRedisValue / ToRedisArgs.

\n\n
use redis::Commands;\n\nlet mut con = client.get_connection()?;\nlet count: i32 = con.incr("counter", 2)?;  // incremento atómico\nlet exists: bool = con.exists("inexistente")?;\nlet members: Vec<String> = con.smembers("set_key")?;
\n\n

2. Pipelines (tuberías)

\n

Los pipelines permiten enviar varios comandos en una sola solicitud de red, lo que acelera significativamente las operaciones por lotes.

\n\n
use redis::Pipeline;\n\nlet mut pipe = Pipeline::new();\npipe.cmd("SET").arg("a").arg(1).ignore();\npipe.cmd("SET").arg("b").arg(2).ignore();\npipe.cmd("GET").arg("a");\nlet result: i32 = pipe.query(&mut con)?;\nprintln!("Valor a: {}", result);
\n\n

3. Modo asíncrono (async/await)

\n

Para aplicaciones de alta carga, utilice la API asíncrona basada en tokio o async-std.

\n\n
use redis::AsyncCommands;\n\n#[tokio::main]\nasync fn main() -> redis::RedisResult<()> {\n    let client = redis::Client::open("redis://127.0.0.1:6379/")?;\n    let mut con = client.get_multiplexed_async_connection().await?;\n\n    con.set("async_key", "async_value").await?;\n    let val: String = con.get("async_key").await?;\n    println!("Async: {}", val);\n\n    Ok(())\n}
\n\n

4. Pub/Sub (publicador-suscriptor)

\n

Implementación del patrón Pub/Sub para intercambio de mensajes en tiempo real.

\n\n
use redis::{AsyncCommands, RedisResult};\n\n#[tokio::main]\nasync fn main() -> RedisResult<()> {\n    let client = redis::Client::open("redis://127.0.0.1:6379/")?;\n\n    // Suscriptor\n    let mut pubsub = client.get_async_connection().await?.into_pubsub();\n    pubsub.subscribe("news").await?;\n\n    loop {\n        let msg = pubsub.next_message().await?;\n        println!("Recibido: {:?}", msg.get_payload::<String>()?);\n    }\n}
\n\n

5. Transacciones (MULTI/EXEC)

\n

Agrupación de comandos en una transacción atómica.

\n\n
use redis::Commands;\n\nlet mut con = client.get_connection()?;\nredis::transaction(&mut con, &["key1", "key2"], |con, pipe| {\n    pipe.cmd("SET").arg("key1").arg(42).ignore();\n    pipe.cmd("INCR").arg("key2");\n    pipe.query(con)\n})?;
\n\n

6. Agrupación en clúster

\n

Para trabajar con Redis Cluster, utilice redis::cluster::ClusterClient:

\n\

Recommendations