Skip to main content

shared/infrastructure/cache/redis/
adapter.rs

1use async_trait::async_trait;
2use redis::AsyncTypedCommands;
3
4use crate::domain::cache::CacheAdapter;
5use crate::error::CoreError;
6
7#[derive(Clone)]
8pub struct RedisAdapter {
9    connection: redis::aio::ConnectionManager,
10}
11
12impl RedisAdapter {
13    pub fn new(connection: redis::aio::ConnectionManager) -> Self {
14        Self { connection }
15    }
16}
17
18#[async_trait]
19impl CacheAdapter for RedisAdapter {
20    async fn insert(&self, key: &str, value: &str, expiration: u64) -> Result<(), CoreError> {
21        self.connection
22            .clone()
23            .set_ex(key, value, expiration)
24            .await
25            .map_err(|e| e.into())
26    }
27
28    async fn find_one(&self, key: &str) -> Result<Option<String>, CoreError> {
29        self.connection.clone().get(key).await.map_err(|e| e.into())
30    }
31
32    async fn update(&self, key: &str, value: &str, expiration: u64) -> Result<(), CoreError> {
33        self.connection
34            .clone()
35            .set_ex(key, value, expiration)
36            .await
37            .map_err(|e| e.into())
38    }
39
40    async fn increment(&self, key: &str) -> Result<u64, CoreError> {
41        self.connection
42            .clone()
43            .incr(key, 1)
44            .await
45            .map(|v| v as u64)
46            .map_err(|e| e.into())
47    }
48
49    async fn delete_one(&self, key: &str) -> Result<(), CoreError> {
50        self.connection
51            .clone()
52            .del(key)
53            .await
54            .map(|_| ())
55            .map_err(|e| e.into())
56    }
57
58    async fn flush_all(&self) -> Result<(), CoreError> {
59        self.connection
60            .clone()
61            .flushall()
62            .await
63            .map(|_| ())
64            .map_err(|e| e.into())
65    }
66}