use std::time::Duration;
use r2d2_redis2::RedisConnectionManager;
use crate::core::errors::Errors;
use crate::core::redis::ReidsClient;
use crate::core::redis::ReidsClientCluster;
use crate::core::redis::ReidsClientSentinel;
use crate::core::redis::ReidsClientStandalone;
use r2d2_redis_cluster2::RedisClusterConnectionManager;
pub fn create_pool(settings: &crate::core::redis::RedisSettings) -> Result<ReidsClient, Errors> {
if settings.connect_mode.clone().unwrap() == *"standalone" {
return Ok(ReidsClient {
standalone_pool: Some(create_pool_with_standalone(settings).unwrap()),
cluster_pool: None,
sentinel_pool: None,
});
}
if settings.connect_mode.clone().unwrap() == *"cluster" {
return Ok(ReidsClient {
standalone_pool: None,
cluster_pool: Some(create_pool_with_cluster(settings).unwrap()),
sentinel_pool: None,
});
}
Err(Errors::GenericError("Not support redis mode".to_string()))
}
fn create_pool_with_standalone(
settings: &crate::core::redis::RedisSettings,
) -> Result<ReidsClientStandalone, Errors> {
let connection_string = settings.connection_string();
let manager = RedisConnectionManager::new(connection_string.clone())
.map_err(|e| Errors::GenericError(e.to_string()))?;
let pool = r2d2::Pool::builder()
.max_size(settings.max_pool_size.unwrap())
.connection_timeout(Duration::from_secs(
settings.connection_timeout_secs.unwrap().into(),
))
.build(manager)
.map_err(|e| Errors::GenericError(e.to_string()));
match pool {
Ok(p) => {
log::info!(
"RedisClient-Standalone: connection_string={}",
connection_string
);
Ok(ReidsClientStandalone { pool: p })
}
Err(e) => {
log::error!(
"RedisClient-Standalone: connection_string={}, error={:?}",
connection_string,
e
);
Err(e)
}
}
}
fn create_pool_with_cluster(
settings: &crate::core::redis::RedisSettings,
) -> Result<ReidsClientCluster, Errors> {
let redis_uri = vec![
"redis://127.0.0.1:6379",
"redis://127.0.0.1:6378",
"redis://127.0.0.1:6377",
];
let manager = RedisClusterConnectionManager::new(redis_uri.clone()).unwrap();
let pool = r2d2_redis_cluster2::r2d2::Pool::builder()
.max_size(settings.max_pool_size.unwrap())
.connection_timeout(Duration::from_secs(
settings.connection_timeout_secs.unwrap().into(),
))
.build(manager)
.map_err(|e| Errors::GenericError(e.to_string()));
match pool {
Ok(p) => {
log::info!("RedisClient-Cluster: connection_string={:?}", redis_uri);
Ok(ReidsClientCluster { pool: p })
}
Err(e) => {
log::error!(
"RedisClient-Cluster: connection_string={:?}, error={:?}",
redis_uri,
e
);
Err(e)
}
}
}
fn _create_pool_with_sentinel(
settings: &crate::core::redis::RedisSettings,
) -> Result<ReidsClientSentinel, Errors> {
let redis_uri = vec![
"redis://127.0.0.1:6379",
"redis://127.0.0.1:6378",
"redis://127.0.0.1:6377",
];
let manager = RedisClusterConnectionManager::new(redis_uri.clone()).unwrap();
let pool = r2d2_redis_cluster2::r2d2::Pool::builder()
.max_size(settings.max_pool_size.unwrap())
.connection_timeout(Duration::from_secs(
settings.connection_timeout_secs.unwrap().into(),
))
.build(manager)
.map_err(|e| Errors::GenericError(e.to_string()));
match pool {
Ok(p) => {
log::info!("RedisClient-Sentinel: connection_string={:?}", redis_uri);
Ok(ReidsClientSentinel { pool: p })
}
Err(e) => {
log::error!(
"RedisClient-Sentinel: connection_string={:?}, error={:?}",
redis_uri,
e
);
Err(e)
}
}
}