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}