tower_redis/
util.rs

1use crate::RedisService;
2use redis::{Cmd, RedisResult, ToRedisArgs, Value};
3use tower::{Service, ServiceExt};
4
5impl RedisService {
6    pub async fn call_service(&self, request: Cmd) -> RedisResult<Value> {
7        let mut service = self.clone();
8        let service = service.ready().await?;
9        let response = service.call(request).await?;
10
11        Ok(response)
12    }
13
14    pub async fn del<K>(&self, key: K) -> RedisResult<Value>
15    where
16        K: ToRedisArgs,
17    {
18        let request = Cmd::del(key);
19
20        self.call_service(request).await
21    }
22
23    pub async fn get<K>(&self, key: K) -> RedisResult<Value>
24    where
25        K: ToRedisArgs,
26    {
27        let request = Cmd::get(key);
28
29        self.call_service(request).await
30    }
31
32    pub async fn set<K, V>(&self, key: K, value: V) -> RedisResult<Value>
33    where
34        K: ToRedisArgs,
35        V: ToRedisArgs,
36    {
37        let request = Cmd::set(key, value);
38
39        self.call_service(request).await
40    }
41
42    pub async fn set_ex<K, V>(&self, key: K, value: V, seconds: u64) -> RedisResult<Value>
43    where
44        K: ToRedisArgs,
45        V: ToRedisArgs,
46    {
47        let request = Cmd::set_ex(key, value, seconds);
48
49        self.call_service(request).await
50    }
51}
52
53#[cfg(test)]
54mod test {
55    use crate::RedisService;
56    use redis::{aio::ConnectionManager, Client, Value};
57
58    const URL: &str = "redis://127.0.0.1:6379";
59
60    #[tokio::test]
61    async fn test_redis_util() {
62        let client = Client::open(URL).unwrap();
63        let connection = ConnectionManager::new(client).await.unwrap();
64        let service = RedisService::new(connection);
65        let mut join_handles = Vec::new();
66
67        for i in 0..100 {
68            let service = service.clone();
69            let key = format!("foo-{}", i);
70            let value = format!("bar-{}", i);
71
72            join_handles.push(tokio::spawn(async move {
73                let res = service.set(key, value).await.unwrap();
74
75                assert_eq!(res, Value::Okay);
76            }));
77        }
78
79        for i in 0..100 {
80            let service = service.clone();
81            let key = format!("foo-{}", i);
82            let key_clone = key.clone();
83            let value = format!("bar-{}", i);
84
85            tokio::spawn(async move {
86                let res = service.get(key).await.unwrap();
87                assert_eq!(res, Value::BulkString(value.into()));
88
89                let res = service.del(key_clone).await.unwrap();
90                assert_eq!(res, Value::Int(1));
91            });
92        }
93    }
94}