use std::collections::HashMap;
use ::redis::aio::ConnectionManager;
use crate::config::{Config, IntoRedisName, RedisConfig};
pub async fn connect(cfg: &RedisConfig) -> anyhow::Result<ConnectionManager> {
let client = ::redis::Client::open(cfg.url.as_str())
.map_err(|e| anyhow::anyhow!("打开 Redis({}) 失败: {}", cfg.url, e))?;
let mgr = ConnectionManager::new(client)
.await
.map_err(|e| anyhow::anyhow!("连接 Redis({}) 失败: {}", cfg.url, e))?;
Ok(mgr)
}
pub struct RedisPools {
conns: HashMap<String, ConnectionManager>,
}
impl RedisPools {
pub async fn from_config(cfg: &Config) -> anyhow::Result<Self> {
let mut conns = HashMap::new();
for (name, rc) in &cfg.redis {
conns.insert(name.clone(), connect(rc).await?);
}
Ok(Self { conns })
}
pub fn get(&self, name: impl IntoRedisName) -> Option<ConnectionManager> {
self.conns.get(&name.into_name()).cloned()
}
pub fn require(&self, name: impl IntoRedisName) -> anyhow::Result<ConnectionManager> {
let name = name.into_name();
self.conns
.get(&name)
.cloned()
.ok_or_else(|| anyhow::anyhow!("未找到名为 `{}` 的 Redis 连接", name))
}
pub fn default(&self) -> anyhow::Result<ConnectionManager> {
self.require("default")
}
}