use deadpool_redis::redis::AsyncCommands;
use deadpool_redis::{Config, Pool, Runtime};
pub async fn init_redis(
url: &str,
password: Option<&str>,
pool_size: usize,
) -> crate::error::AppResult<Pool> {
let final_url = if let Some(pwd) = password {
if !url.contains('@') {
if let Some(prefix_end) = url.find("://") {
let prefix = &url[..prefix_end + 3];
let rest = &url[prefix_end + 3..];
format!("{}:{}@{}", prefix, pwd, rest)
} else {
url.to_string()
}
} else {
tracing::warn!("Redis URL 中已包含密码,忽略单独的密码配置");
url.to_string()
}
} else {
url.to_string()
};
let mut cfg = Config::from_url(final_url);
if pool_size > 0 {
cfg.pool = Some(deadpool_redis::PoolConfig {
max_size: pool_size,
..Default::default()
});
}
let pool = cfg
.create_pool(Some(Runtime::Tokio1))
.map_err(|e| crate::error::AppError::Internal(anyhow::anyhow!(e)))?;
let mut conn = pool.get().await?;
let _: String = conn.ping().await?;
tracing::info!("Redis缓存初始化成功");
Ok(pool)
}