Rust 的 Redis 客户端:redis-rs 库
redis-rs 库是 Rust 生态系统中用于操作 Redis 的主要且最流行的客户端。它提供了与 Redis 交互的完整功能集:从简单的 GET/SET 命令到复杂的事务、管道和 Pub/Sub。由于支持同步和异步 (async/await) 模式,redis-rs 适用于任何项目——从脚本到高负载的 Web 服务器。
该库使用纯 Rust 编写,采用安全的内存管理和类型安全,从而最大限度地减少运行时错误。支持所有流行的 Redis 数据类型:字符串、列表、集合、哈希、有序集合、位图、HyperLogLog 和流。
安装与连接
在 Cargo.toml 文件中添加依赖项:
[dependencies]redis = { version = "0.27", features = ["tokio-comp"] }对于同步使用,只需 redis = "0.27" 即可。对于异步使用,请选择一个执行器:tokio-comp(默认)或 async-std-comp。
基本使用(同步模式)
连接到本地 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("my_key", "hello world")?; let value: String = con.get("my_key")?; println!("获取到的值: {}", value);
// 操作哈希 con.hset("user:1", "name", "Alice")?; con.hset("user:1", "age", "30")?; let name: String = con.hget("user:1", "name")?; println!("用户名: {}", name);
Ok(())}请注意自动反序列化:您指定要将结果转换成的类型(String、i32、Vec<String> 等),库会自动完成所有操作。
使用 Tokio 的异步模式
对于高性能应用程序,请使用异步 API:
use redis::AsyncCommands;use tokio;
#[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?;
// 设置带 TTL(键的生存时间) con.set_ex("temp_key", "临时值", 60).await?; let val: Option<String> = con.get("temp_key").await?; println!("值: {:?}", val);
// 操作列表 con.lpush("queue", "task1").await?; con.lpush("queue", "task2").await?; let tasks: Vec<String> = con.lrange("queue", 0, -1).await?; println!("队列中的任务: {:?}", tasks);
Ok(())}异步客户端使用多路复用连接(一个 TCP 套接字处理多个请求),这显著提高了性能。
高级功能
管道(批处理)
允许在一次网络调用中发送多个命令,从而加速批量操作:
use redis::pipe;
fn main() -> redis::RedisResult<()> { let client = redis::Client::open("redis://127.0.0.1:6379/")?; let mut con = client.get_connection()?;
let (val1, val2): (i32, i32) = redis::pipe() .cmd("INCR").arg("counter_a").ignore() .cmd("INCR").arg("counter_b").ignore() .cmd("GET").arg("counter_a").query(&mut con)? .cmd("GET").arg("counter_b").query(&mut con)?;
println!("计数器: {}, {}", val1, val2); Ok(())}Pub/Sub(发布/订阅)
订阅频道的示例:
use redis::pubsub::PubSubCommands;
fn main() -> redis::RedisResult<()> {