#redis #serde #serialization #proc-macro

redis-derive

此crate实现了mitsuhiko / redis-rs中的redis::FromRedisValue和redis::ToRedisArgs特质,适用于任何结构体

3个版本

0.1.7 2023年2月14日
0.1.6 2022年7月16日
0.1.5 2022年3月1日
0.1.1 2022年2月28日

#1642 in 编码

Download history 322/week @ 2024-03-14 535/week @ 2024-03-21 422/week @ 2024-03-28 294/week @ 2024-04-04 594/week @ 2024-04-11 659/week @ 2024-04-18 802/week @ 2024-04-25 489/week @ 2024-05-02 723/week @ 2024-05-09 472/week @ 2024-05-16 396/week @ 2024-05-23 435/week @ 2024-05-30 401/week @ 2024-06-06 222/week @ 2024-06-13 167/week @ 2024-06-20 127/week @ 2024-06-27

1,009 每月下载量
2 crate中使用

MIT/Apache

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