3个版本
0.1.7 | 2023年2月14日 |
---|---|
0.1.6 | 2022年7月16日 |
0.1.5 | 2022年3月1日 |
0.1.1 |
|
#1642 in 编码
1,009 每月下载量
在 2 crate中使用
29KB
375 行
redis-derive
此crate实现了从 mitsuhiko / redis-rs
(https://github.com/mitsuhiko/redis-rs) 为任何结构体实现的 FromRedisValue
(redis::FromRedisValue) 和 ToRedisArgs
(redis::ToRedisArgs) 特质,这允许Rust结构体和Redis哈希集合之间无缝的类型转换。
这与将结构体JSON编码后存储在Redis键中更为有益,因为当将数据作为Redis哈希集合保存时,可以在不移动数据库中的数据的情况下执行排序算法。
还可以获取数据库中结构体的单个值。
使用和示例
要使用此crate,将其添加到依赖项中,并导入以下到过程宏。
use redis_derive::{FromRedisValue, ToRedisArgs};
现在,可以使用这些宏为您的装饰结构体实现特质 FromRedisValue
(redis::FromRedisValue) 和 ToRedisArgs
(redis::ToRedisArgs)。
#[derive(ToRedisArgs, FromRedisValue)]
struct MySuperCoolStruct {
first_field : String,
second_field : Option<i64>,
third_field : Vec<String>
}
这些过程宏适用于任何结构体,其中每个字段的类型也实现了 ToRedisArgs
(redis::ToRedisArgs),因此这将是允许的
#[derive(ToRedisArgs, FromRedisVaule)]
struct MySuperCoolStruct {
first_field : String,
second_field : Option<i64>,
third_field : Vec<String>
}
#[derive(ToRedisArgs, FromRedisVaule)]
struct MySecondSuperCoolStruct {
fourth_field : String,
inner_struct : MySuperCoolStruct
}
完整示例
use redis::Commands;
use redis_derive::{FromRedisValue, ToRedisArgs};
#[derive(FromRedisValue, ToRedisArgs, Debug)]
struct MySuperCoolStruct {
first_field : String,
second_field : Option<i64>,
third_field : Vec<String>
}
fn main() -> redis::RedisResult<()> {
let client = redis::Client::open("redis://127.0.0.1/")?;
let mut con = client.get_connection()?;
let test1 = MySuperCoolStruct{
first_field : "Hello World".to_owned(),
second_field : Some(42),
third_field : vec!["abc".to_owned(), "cba".to_owned()]
};
let _ = redis::cmd("HSET")
.arg("test1")
.arg(&test1)
.query(&mut con)?;
let db_test1 : MySuperCoolStruct = con.hgetall("test1")?;
println!("send : {:#?}, got : {:#?}", test1, db_test1);
Ok(())
}
问题和未来计划
目前,枚举上不能有任何字段。
未来计划
- 实现Redis派生类型的getter和setter,我想象的是这样的
#[derive(RedisGetter, RedisSetter)]
struct MySuperCoolStruct {
first_field : String,
second_field : Option<i64>,
third_field : Vec<String>
}
fn somefn() {
let mut redis_client = /* geting some connection to redis db */;
let first_field : String = MySuperCoolStruct::first_field::get(&redis_client, key : "MyRedisKeyForStruct");
MySuperCoolStruct::first_field::set(&redis_client, key : "MyRedisKeyForStruct", value : String::from("test"));
}
许可证:MIT OR Apache-2.0
依赖项
~2.8–4MB
~100K SLoC