redis = "0.29.1"这个 crate本身没有内置连接池。
它提供的是:
redis::Client:Redis 客户端client.get_connection():获取单个同步连接client.get_multiplexed_async_connection():获取单个异步可复用连接
这些都不是连接池。
如果你要 Rust Redis 连接池
常见做法是额外引入池化库:
| 库 | 适用场景 |
|---|---|
deadpool-redis | 异步,推荐 |
bb8-redis | 异步 |
r2d2_redis | 同步 |
推荐依赖
[dependencies] redis = "0.29.1" deadpool-redis = "0.18" tokio = { version = "1", features = ["full"] }版本号以你项目实际能编译通过为准。
连接池示例
use deadpool_redis::{Manager, Pool}; pub async fn create_redis_pool() -> Pool { let mgr = Manager::new("redis://127.0.0.1:6379/").unwrap(); Pool::builder(mgr) .max_size(16) .build() .unwrap() }使用连接
let pool = create_redis_pool().await; let mut conn = pool.get().await.unwrap(); let _: () = redis::cmd("SET") .arg(&["foo", "bar"]) .query_async(&mut conn) .await .unwrap();全局静态连接池写法
use deadpool_redis::{Manager, Pool}; use tokio::sync::OnceCell; static REDIS_POOL: OnceCell<Pool> = OnceCell::const_new(); pub async fn get_redis_pool() -> &'static Pool { REDIS_POOL .get_or_init(|| async { let mgr = Manager::new("redis://127.0.0.1:6379/").unwrap(); Pool::builder(mgr) .max_size(16) .build() .unwrap() }) .await }使用:
let pool = get_redis_pool().await; let mut conn = pool.get().await.unwrap(); let _: () = redis::cmd("GET") .arg(&["foo"]) .query_async(&mut conn) .await .unwrap();结论
redis = "0.29.1"没有自带连接池。
如果你要连接池,建议用:
deadpool-redis然后全局维护一个Pool,每次通过pool.get().await获取连接。
需要我把数据库连接池和 Redis 连接池的配置整合成一份完整的 Cargo.toml 依赖清单吗?