#[cfg(feature = "redis")]
mod client;
mod config;
mod error;
#[cfg(feature = "redis")]
pub use client::RedisClient;
pub use config::{PoolConfig, RedisCluster, RedisConfig, RedisMode, RedisNode, RedisSentinel};
pub use error::{RedisError, Result};
#[cfg(feature = "redis")]
use std::sync::Arc;
#[cfg(feature = "redis")]
use tokio::sync::OnceCell;
#[cfg(feature = "redis")]
pub static REDIS_CLIENT: OnceCell<Arc<RedisClient>> = OnceCell::const_new();
#[cfg(feature = "redis")]
pub async fn get_client() -> Arc<RedisClient> {
REDIS_CLIENT
.get()
.expect("Redis client not initialized")
.clone()
}
#[cfg(feature = "redis")]
pub async fn init(config: RedisConfig) -> Result<Arc<RedisClient>> {
let client = RedisClient::new(config).await?;
let client = Arc::new(client);
if REDIS_CLIENT.set(client.clone()).is_err() {
return Err(RedisError::AlreadyInitialized);
}
Ok(client)
}
#[cfg(all(test, feature = "redis"))]
mod tests {
use super::*;
#[tokio::test]
async fn test_redis_global_client() {
let config = RedisConfig {
mode: RedisMode::Standalone,
node: Some(RedisNode {
host: "localhost".to_string(),
port: 6379,
}),
sentinel: None,
cluster: None,
pool: PoolConfig::default(),
password: Some("1qaz!QAZ".to_string()),
database: None,
};
let client = init(config).await.unwrap();
client
.set("test_init_key", "test_init_value")
.await
.unwrap();
let global_client = get_client().await;
let value = global_client.get("test_init_key").await.unwrap();
assert_eq!(value, Some("test_init_value".to_string()));
}
#[tokio::test]
async fn test_redis_init_twice() {
let config = RedisConfig {
mode: RedisMode::Standalone,
node: Some(RedisNode {
host: "localhost".to_string(),
port: 6379,
}),
sentinel: None,
cluster: None,
pool: PoolConfig::default(),
password: Some("1qaz!QAZ".to_string()),
database: None,
};
let result = init(config.clone()).await;
match result {
Err(RedisError::AlreadyInitialized) => (),
_ => panic!("Expected AlreadyInitialized error"),
}
}
}