shared/infrastructure/cache/redis/
adapter.rs1use 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}