gbserver/gb-storage/src/redis.rs

79 lines
2.7 KiB
Rust
Raw Normal View History

2024-12-22 20:56:52 -03:00
use gb_core::{Result, Error};
2024-12-24 13:05:54 -03:00
use redis::{Client, Commands};
2024-12-22 20:56:52 -03:00
use serde::{de::DeserializeOwned, Serialize};
use std::time::Duration;
2024-12-24 13:05:54 -03:00
use tracing::instrument;
2024-12-22 20:56:52 -03:00
2024-12-24 13:05:54 -03:00
pub struct RedisStorage {
2024-12-22 20:56:52 -03:00
client: Client,
}
2024-12-24 13:05:54 -03:00
impl RedisStorage {
pub fn new(url: &str) -> Result<Self> {
let client = Client::open(url)
.map_err(|e| Error::internal(format!("Redis error: {}", e)))?;
2024-12-26 10:09:39 -03:00
Ok(Self { client })
}
#[allow(dependency_on_unit_never_type_fallback)]
#[instrument(skip(self))]
2024-12-24 13:05:54 -03:00
pub async fn set<T: Serialize + std::fmt::Debug>(&self, key: &str, value: &T) -> Result<()> {
let mut conn = self.client.get_connection()
.map_err(|e| Error::internal(format!("Redis error: {}", e)))?;
2024-12-26 10:09:39 -03:00
2024-12-22 20:56:52 -03:00
let serialized = serde_json::to_string(value)
2024-12-23 00:54:50 -03:00
.map_err(|e| Error::internal(format!("Serialization error: {}", e)))?;
2024-12-22 20:56:52 -03:00
2024-12-24 13:05:54 -03:00
conn.set(key, serialized)
.map_err(|e| Error::internal(format!("Redis error: {}", e)))?;
2024-12-22 20:56:52 -03:00
Ok(())
}
#[instrument(skip(self))]
pub async fn get<T: DeserializeOwned>(&self, key: &str) -> Result<Option<T>> {
2024-12-24 13:05:54 -03:00
let mut conn = self.client.get_connection()
.map_err(|e| Error::internal(format!("Redis error: {}", e)))?;
2024-12-22 20:56:52 -03:00
let value: Option<String> = conn.get(key)
2024-12-24 13:05:54 -03:00
.map_err(|e| Error::internal(format!("Redis error: {}", e)))?;
2024-12-22 20:56:52 -03:00
match value {
Some(v) => {
let deserialized = serde_json::from_str(&v)
2024-12-23 00:54:50 -03:00
.map_err(|e| Error::internal(format!("Deserialization error: {}", e)))?;
2024-12-22 20:56:52 -03:00
Ok(Some(deserialized))
}
2024-12-24 13:05:54 -03:00
None => Ok(None)
2024-12-22 20:56:52 -03:00
}
}
#[instrument(skip(self))]
2024-12-24 13:05:54 -03:00
pub async fn delete(&self, key: &str) -> Result<bool> {
let mut conn = self.client.get_connection()
.map_err(|e| Error::internal(format!("Redis error: {}", e)))?;
2024-12-22 20:56:52 -03:00
conn.del(key)
2024-12-24 13:05:54 -03:00
.map_err(|e| Error::internal(format!("Redis error: {}", e)))
2024-12-22 20:56:52 -03:00
}
2024-12-26 10:09:39 -03:00
#[allow(dependency_on_unit_never_type_fallback)]
2024-12-22 20:56:52 -03:00
#[instrument(skip(self))]
2024-12-24 13:05:54 -03:00
pub async fn set_with_ttl<T: Serialize + std::fmt::Debug>(&self, key: &str, value: &T, ttl: Duration) -> Result<()> {
let mut conn = self.client.get_connection()
.map_err(|e| Error::internal(format!("Redis error: {}", e)))?;
2024-12-22 20:56:52 -03:00
let serialized = serde_json::to_string(value)
2024-12-23 00:54:50 -03:00
.map_err(|e| Error::internal(format!("Serialization error: {}", e)))?;
2024-12-22 20:56:52 -03:00
2024-12-24 13:05:54 -03:00
redis::pipe()
.set(key, serialized)
.expire(key, ttl.as_secs() as i64)
.query(&mut conn)
.map_err(|e| Error::internal(format!("Redis error: {}", e)))?;
2024-12-22 20:56:52 -03:00
Ok(())
}
2024-12-24 13:05:54 -03:00
}