Bibliothek redis-rs: Rust-Client für Redis
\n\nredis-rs ist die wichtigste, ausgereifte und beliebteste Bibliothek für die Arbeit mit Redis aus der Sprache Rust. Sie bietet sowohl eine synchrone als auch eine asynchrone (basierend auf tokio oder async-std) API, unterstützt Clustering, Pipelines, Pub/Sub, Transaktionen und Lua-Skripte. Die Bibliothek zeichnet sich durch hohe Leistung, Typsicherheit und Ergonomie aus, die dem Rust-Ökosystem eigen sind.
Installation und Verbindung
\n\nFügen Sie die Abhängigkeit in Cargo.toml hinzu:
[dependencies]\nredis = { version = "0.25", features = ["tokio-comp"] } # für async mit tokio\n# oder\nredis = "0.25" # nur synchroner Modus\n\nBasisverbindung zu Redis (synchrone Variante):
\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 // Setzen und Abrufen eines Wertes\n con.set("key", "value")?;\n let val: String = con.get("key")?;\n println!("Erhalten: {}", val);\n\n Ok(())\n}\n\nHauptfunktionen
\n\n1. Typisierte Befehle
\nDie Bibliothek konvertiert automatisch Rust-Typen in Redis-Typen und umgekehrt. Unterstützt werden Strings, Zahlen, Tupel, Vektoren sowie benutzerdefinierte Typen über die Traits FromRedisValue / ToRedisArgs.
use redis::Commands;\n\nlet mut con = client.get_connection()?;\nlet count: i32 = con.incr("counter", 2)?; // atomare Erhöhung\nlet exists: bool = con.exists("nonexistent")?;\nlet members: Vec<String> = con.smembers("set_key")?;\n\n2. Pipelines
\nPipelines ermöglichen das Senden mehrerer Befehle in einer einzigen Netzwerkanfrage, was Batch-Operationen erheblich beschleunigt.
\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!("Wert a: {}", result);\n\n3. Asynchroner Modus (async/await)
\nFür stark ausgelastete Anwendungen verwenden Sie die asynchrone API basierend auf tokio oder 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 (Publisher/Subscriber)
\nImplementierung des Pub/Sub-Musters für den Nachrichtenaustausch in Echtzeit.
\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 // Subscriber\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!("Erhalten: {:?}", msg.get_payload::<String>()?);\n }\n}\n\n5. Transaktionen (MULTI/EXEC)
\nGruppierung von Befehlen in einer atomaren Transaktion.
\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. Clustering
\nFür die Arbeit mit Redis Cluster verwenden Sie redis::cluster::ClusterClient: