use redis::AsyncCommands;
#[derive(Clone)]
pub struct ReidsClientStandalone {
pub client: redis::Client,
}
impl ReidsClientStandalone {
#[allow(deprecated)]
pub async fn get_connection(&self) -> Result<impl redis::aio::ConnectionLike, anyhow::Error> {
Ok(self.client.get_async_connection().await?)
}
pub async fn ttl(&self, key: &str) -> Result<i32, anyhow::Error> {
Ok(self.get_connection().await?.ttl(key).await?)
}
pub async fn exists(&self, key: &str) -> Result<bool, anyhow::Error> {
Ok(self.get_connection().await?.exists(key).await?)
}
pub async fn set<T>(&self, key: &str, value: &T) -> Result<(), anyhow::Error>
where
T: serde::Serialize,
{
let serialized_data = serde_json::to_string(value)?;
self.get_connection()
.await?
.set(key, serialized_data)
.await?;
Ok(())
}
pub async fn set_ex<T>(&self, key: &str, value: &T, seconds: u64) -> Result<(), anyhow::Error>
where
T: serde::Serialize,
{
let serialized_data = serde_json::to_string(value)?;
self.get_connection()
.await?
.set_ex(key, serialized_data, seconds)
.await?;
Ok(())
}
pub async fn get<T>(&self, key: &str) -> Result<Option<T>, anyhow::Error>
where
T: serde::de::DeserializeOwned,
{
let mut conn = self.get_connection().await?;
if !conn.exists(key).await? {
return Ok(None);
}
let json_str: String = match conn.get(key).await {
Ok(v) => v,
Err(e) => {
return Err(e.into());
}
};
let return_value = serde_json::from_str(&json_str)?;
Ok(Some(return_value))
}
}