async/
async.rs

1use cache_ru::{AsyncCache, RedisConfig};
2use redis::{ErrorKind, FromRedisValue, ToRedisArgs, Value};
3
4#[tokio::main]
5async fn main() {
6    let ca = AsyncCache::new(RedisConfig::new("192.168.100.5:6379", 1))
7        .await
8        .unwrap();
9    let mut ca1 = ca.clone();
10    let f1 = tokio::spawn(async move {
11        ca1.set("AsyncKey1", "AsyncValue1").await.unwrap();
12        let val: String = ca1.get("AsyncKey1").await.unwrap();
13        println!("val: {val}");
14        ca1.del("AsyncKey1").await.unwrap();
15    });
16    let mut ca2 = ca.clone();
17    let f2 = tokio::spawn(async move {
18        ca2.hsetall(
19            UserKey,
20            User {
21                id: "123".into(),
22                name: "abc".into(),
23                age: 321,
24            },
25        )
26        .await
27        .unwrap();
28        let u: User = ca2.hgetall(UserKey).await.unwrap();
29        println!("user: {:?}", u);
30        ca2.del(UserKey).await.unwrap();
31    });
32
33    let _ = tokio::join!(f1, f2);
34}
35
36struct UserKey;
37
38impl ToRedisArgs for UserKey {
39    fn write_redis_args<W>(&self, out: &mut W)
40    where
41        W: ?Sized + redis::RedisWrite,
42    {
43        out.write_arg(b"UserKey")
44    }
45}
46
47#[derive(Default, Debug)]
48struct User {
49    id: String,
50    name: String,
51    age: i32,
52}
53
54impl ToRedisArgs for User {
55    fn write_redis_args<W>(&self, out: &mut W)
56    where
57        W: ?Sized + redis::RedisWrite,
58    {
59        out.write_arg(b"id");
60        out.write_arg(self.id.as_bytes());
61        out.write_arg(b"name");
62        out.write_arg(self.name.as_bytes());
63        out.write_arg(b"age");
64        out.write_arg(&self.age.to_ne_bytes());
65    }
66}
67
68impl FromRedisValue for User {
69    fn from_redis_value(v: &redis::Value) -> redis::RedisResult<Self> {
70        let map_iter = v.as_map_iter().ok_or((ErrorKind::TypeError, ""))?;
71        let mut u = User::default();
72        for (k, v) in map_iter {
73            if let Value::Data(key) = k {
74                match key.as_slice() {
75                    b"id" => {
76                        if let Value::Data(val) = v {
77                            u.id = String::from_utf8(val.to_owned()).unwrap();
78                        }
79                    }
80                    b"name" => {
81                        if let Value::Data(val) = v {
82                            u.name = String::from_utf8(val.to_owned()).unwrap();
83                        }
84                    }
85                    b"age" => {
86                        if let Value::Data(val) = v {
87                            u.age = i32::from_ne_bytes(val[..].try_into().unwrap());
88                        }
89                    }
90                    _ => {}
91                }
92            }
93        }
94        Ok(u)
95    }
96}