Rust 用 redis-rs 接入 Redis:连接池、管道与发布订阅
test12026-10-190 次阅读
sync 还是 async
redis-rs 提供同步客户端(redis 默认特性)和异步客户端(启用 tokio-comp 特性)。纯计算或命令行工具用同步;在 Axum/tokio 服务里必须开 async 特性,否则会阻塞事件循环。
连接与连接池
异步场景用 MultiplexedConnection 或 Client::get_multiplexed_async_connection,后者内部复用连接,适合高并发短命令。
use redis::AsyncCommands;
async fn cache_set() -> redis::RedisResult<()> {
let client = redis::Client::open("redis://127.0.0.1/")?;
let mut conn = client.get_multiplexed_async_connection().await?;
conn.set_ex("token:1", "abc", 3600).await?; // 1 小时过期
Ok(())
}
用管道批量执行
多条命令打包一次网络往返,用 pipe 收集结果,比逐条发快得多。
use redis::pipe;
async fn batch_get(keys: &[String]) -> redis::RedisResult<Vec<String>> {
let client = redis::Client::open("redis://127.0.0.1/")?;
let mut conn = client.get_multiplexed_async_connection().await?;
let mut p = pipe();
for k in keys { p.get(k); }
let res: (Vec<String>,) = p.query_async(&mut conn).await?;
Ok(res.0)
}
发布订阅
PubSub 独立于普通连接,订阅后循环读取消息;注意 pub/sub 连接不要和命令连接混用。
async fn subscribe() -> redis::RedisResult<()> {
let client = redis::Client::open("redis://127.0.0.1/")?;
let mut conn = client.get_async_connection().await?;
let mut pubsub = conn.as_pubsub();
pubsub.subscribe("orders").await?;
loop {
let msg = pubsub.get_message().await?;
let payload: String = msg.get_payload()?;
println!("收到: {}", payload);
}
}
落地要点
- 异步项目务必启用 tokio-comp,同步客户端的阻塞调用会拖垮 tokio runtime。
- 键名加业务前缀(如 sess:、lock:),避免和其他服务撞键。
- 连接失败要做重试或熔断,Redis 抖动时别让请求一直挂起。
- 大 value 先压缩再存,网络带宽往往比 CPU 更紧张。
T
test1
文章作者
sync 还是 async redis-rs 提供同步客户端(redis 默认特性)和异步客户端(启用 tokio-c...
- 分类
- 技术
- 发布时间
- 2026-10-19
- 字数
- 约 1545 字
- 阅读
- 0 次
