Biblioteca redis-rs: Cliente Rust para Redis
\n\nredis-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.
Instalación y conexión
\n\nAñada la dependencia en Cargo.toml:
[dependencies]\nredis = { version = "0.25", features = ["tokio-comp"] } # para async con tokio\n# o\nredis = "0.25" # solo modo síncrono\n\nConexión básica a Redis (variante síncrona):
\n\nuse 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\nFuncionalidades principales
\n\n1. Comandos tipados
\nLa 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.
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\n2. Pipelines (tuberías)
\nLos pipelines permiten enviar varios comandos en una sola solicitud de red, lo que acelera significativamente las operaciones por lotes.
\n\nuse 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\n3. Modo asíncrono (async/await)
\nPara aplicaciones de alta carga, utilice la API asíncrona basada en tokio o async-std.
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\n4. Pub/Sub (publicador-suscriptor)
\nImplementación del patrón Pub/Sub para intercambio de mensajes en tiempo real.
\n\nuse 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\n5. Transacciones (MULTI/EXEC)
\nAgrupación de comandos en una transacción atómica.
\n\nuse 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\n6. Agrupación en clúster
\nPara trabajar con Redis Cluster, utilice redis::cluster::ClusterClient:
También en la biblioteca
Trabajo con XML en C++: bibliotecas PugiXML y RapidXML
Trabajo con Excel en Java: Apache POI y alternativas
Geolocalización y mapas en PHP: revisión de bibliotecas y herramientas
Aprendizaje automático en C# (.NET): revisión de las bibliotecas ML.NET, Accord.NET, TensorFlow.NET
Monitoreo de aplicaciones PHP: herramientas y prácticas para el desarrollador