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 次