in core/src/services/redis/backend.rs [150:209]
fn build(self) -> Result<impl Access> {
let root = normalize_root(
self.config
.root
.clone()
.unwrap_or_else(|| "/".to_string())
.as_str(),
);
if let Some(endpoints) = self.config.cluster_endpoints.clone() {
let mut cluster_endpoints: Vec<ConnectionInfo> = Vec::default();
for endpoint in endpoints.split(',') {
cluster_endpoints.push(self.get_connection_info(endpoint.to_string())?);
}
let mut client_builder = ClusterClientBuilder::new(cluster_endpoints);
if let Some(username) = &self.config.username {
client_builder = client_builder.username(username.clone());
}
if let Some(password) = &self.config.password {
client_builder = client_builder.password(password.clone());
}
let client = client_builder.build().map_err(format_redis_error)?;
let conn = OnceCell::new();
Ok(RedisBackend::new(Adapter {
addr: endpoints,
client: None,
cluster_client: Some(client),
conn,
default_ttl: self.config.default_ttl,
})
.with_normalized_root(root))
} else {
let endpoint = self
.config
.endpoint
.clone()
.unwrap_or_else(|| DEFAULT_REDIS_ENDPOINT.to_string());
let client =
Client::open(self.get_connection_info(endpoint.clone())?).map_err(|e| {
Error::new(ErrorKind::ConfigInvalid, "invalid or unsupported scheme")
.with_context("service", Scheme::Redis)
.with_context("endpoint", self.config.endpoint.as_ref().unwrap())
.with_context("db", self.config.db.to_string())
.set_source(e)
})?;
let conn = OnceCell::new();
Ok(RedisBackend::new(Adapter {
addr: endpoint,
client: Some(client),
cluster_client: None,
conn,
default_ttl: self.config.default_ttl,
})
.with_normalized_root(root))
}
}