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}