redis-rs 库:用于 Redis 的 Rust 客户端
redis-rs 是一个成熟且最流行的 Rust 语言 Redis 操作库。它提供同步和异步(基于 tokio 或 async-std)API,支持集群、管道、发布/订阅、事务和 Lua 脚本。该库具有 Rust 生态系统特有的高性能、类型安全和人体工程学特性。
安装与连接
在 Cargo.toml 中添加依赖:
[dependencies]redis = { version = "0.25", features = ["tokio-comp"] } # 用于基于 tokio 的异步# 或redis = "0.25" # 仅同步模式基本 Redis 连接(同步方式):
use redis::Commands;
fn main() -> redis::RedisResult<()> { let client = redis::Client::open("redis://127.0.0.1:6379/")?; let mut con = client.get_connection()?;
// 设置和获取值 con.set("key", "value")?; let val: String = con.get("key")?; println!("获取的值: {}", val);
Ok(())}主要功能
1. 类型化命令
库会自动将 Rust 类型转换为 Redis 类型,反之亦然。支持字符串、数字、元组、向量,以及通过 FromRedisValue / ToRedisArgs trait 实现的自定义类型。
use redis::Commands;
let mut con = client.get_connection()?;let count: i32 = con.incr("counter", 2)?; // 原子递增let exists: bool = con.exists("nonexistent")?;let members: Vec<String> = con.smembers("set_key")?;2. 管道
管道允许通过一次网络请求发送多个命令,从而显著加速批量操作。
use redis::Pipeline;
let mut pipe = Pipeline::new();pipe.cmd("SET").arg("a").arg(1).ignore();pipe.cmd("SET").arg("b").arg(2).ignore();pipe.cmd("GET").arg("a");let result: i32 = pipe.query(&mut con)?;println!("a 的值: {}", result);3. 异步模式 (async/await)
对于高负载应用,请使用基于 tokio 或 async-std 的异步 API。
use redis::AsyncCommands;
#[tokio::main]async fn main() -> redis::RedisResult<()> { let client = redis::Client::open("redis://127.0.0.1:6379/")?; let mut con = client.get_multiplexed_async_connection().await?;
con.set("async_key", "async_value").await?; let val: String = con.get("async_key").await?; println!("异步: {}", val);
Ok(())}4. 发布/订阅
实现实时消息交换的发布/订阅模式。
use redis::{AsyncCommands, RedisResult};
#[tokio::main]async fn main() -> RedisResult<()> { let client = redis::Client::open("redis://127.0.0.1:6379/")?;
// 订阅者 let mut pubsub = client.get_async_connection().await?.into_pubsub(); pubsub.subscribe("news").await?;
loop { let msg = pubsub.next_message().await?; println!("收到: {:?}", msg.get_payload::<String>()?); }}5. 事务 (MULTI/EXEC)
将命令分组为原子事务。
use redis::Commands;
let mut con = client.get_connection()?;redis::transaction(&mut con, &["key1", "key2"], |con, pipe| { pipe.cmd("SET").arg("key1").arg(42).ignore(); pipe.cmd("INCR").arg("key2"); pipe.query(con)})?;6. 集群
要使用 Redis 集群,请使用 redis::cluster::ClusterClient: