Bibliothèque redis-rs : client Rust pour Redis
\n\nredis-rs est la bibliothèque principale, mature et la plus populaire pour travailler avec Redis depuis le langage Rust. Elle fournit une API à la fois synchrone et asynchrone (basée sur tokio ou async-std), prend en charge le clustering, les pipelines, Pub/Sub, les transactions et les scripts Lua. La bibliothèque se distingue par ses hautes performances, sa sécurité de type et son ergonomie, propres à l'écosystème Rust.
Installation et connexion
\n\nAjoutez la dépendance dans Cargo.toml :
[dependencies]\nredis = { version = "0.25", features = ["tokio-comp"] } # pour async avec tokio\n# ou\nredis = "0.25" # mode synchrone uniquement\n\nConnexion de base à Redis (version synchrone) :
\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 // Définition et récupération d'une valeur\n con.set("key", "value")?;\n let val: String = con.get("key")?;\n println!("Reçu : {}", val);\n\n Ok(())\n}\n\nFonctionnalités principales
\n\n1. Commandes typées
\nLa bibliothèque convertit automatiquement les types Rust en types Redis et vice versa. Les chaînes, nombres, tuples, vecteurs sont pris en charge, ainsi que les types personnalisés via les traits FromRedisValue / ToRedisArgs.
use redis::Commands;\n\nlet mut con = client.get_connection()?;\nlet count: i32 = con.incr("counter", 2)?; // incrémentation atomique\nlet exists: bool = con.exists("nonexistent")?;\nlet members: Vec<String> = con.smembers("set_key")?;\n\n2. Pipelines (tuyaux)
\nLes pipelines permettent d'envoyer plusieurs commandes en une seule requête réseau, ce qui accélère considérablement les opérations par lots.
\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!("Valeur de a : {}", result);\n\n3. Mode asynchrone (async/await)
\nPour les applications à forte charge, utilisez l'API asynchrone basée sur tokio ou 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 (éditeur-abonné)
\nImplémentation du modèle Pub/Sub pour l'échange de messages en temps réel.
\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 // Abonné\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!("Reçu : {:?}", msg.get_payload::<String>()?);\n }\n}\n\n5. Transactions (MULTI/EXEC)
\nRegroupement de commandes en une transaction atomique.
\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
\nPour travailler avec Redis Cluster, utilisez redis::cluster::ClusterClient :
Aussi dans la bibliothèque
Métriques Prometheus en Kotlin : intégration avec Micrometer et Ktor
Travailler avec Markdown en C++ : bibliothèques md4c, cmark et cpp-markdown
Travail avec les images en C++ : bibliothèques CImg et STB Image