#macro-derive #redis #bincode #macro #derive

redis-macros-derive-bincode

使用bincode序列化/反序列化结构以存储在Redis中的派生宏

1个不稳定版本

0.1.0 2023年11月2日

过程宏中排名第774

MIT许可协议

15KB
120

redis-macros-derive-bincode

redis-rs提供简单宏和包装器,以使用bincode序列化器自动将结构体序列化和反序列化(使用serde)。这是根据测试最快的序列化/反序列化器。比json快3.5-6倍。

来源

宏的大多数代码来自Daniel Grant的redis-macros/redis-macros-derive。这个crate出现是因为序列化库没有相同的接口,原始宏使用到_string/from_string函数进行序列化和反序列化,这些函数由基于文本的序列化器(如Json和Yaml)支持。

安装

要安装它,只需添加包redis-macros-derive-bincode。这个包是redis的辅助工具,使用serdebincode

[dependencies]
redis-macros-derive-bincode = "0.1.0"
redis = { version = "0.22.2" }
serde = { version = "1.0.152", features = ["derive"] }
bincode = { version = "1.3.3" }

基本用法

简单用法

最简单的方法是派生任何类型的结构的SerializeDeserializeFromRedisValueToRedisArgs...然后就这样!现在你可以使用常规的redis命令获取和设置这些值

use redis::{Client, Commands, RedisResult};
use redis_macros_derive_bincode::{FromRedisValue, ToRedisArgs};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
enum Address {
    Street(String),
    Road(String),
}

// Derive the necessary traits
#[derive(Serialize, Deserialize, FromRedisValue, ToRedisArgs)]
struct User {
    id: u32,
    name: String,
    addresses: Vec<Address>,
}

fn main () -> redis::RedisResult<()> {
    let client = redis::Client::open("redis://127.0.0.1:6379/")?;
    let mut con = client.get_connection()?;

    let user = User {
        id: 1,
        name: "Ziggy".to_string(),
        addresses: vec![
            Address::Street("Downing".to_string()),
            Address::Road("Abbey".to_string()),
        ],
    };

    // Just use it as you would a primitive
    con.set("user", user)?;
    // user and stored_user will be the same
    let stored_user: User = con.get("user")?;
}

有关更多信息,请参阅基本异步示例。

使用deadpool-redis或其他crate

如果你使用的是重新导出redis traits的crate,例如deadpool-redis,仍然可以使用这些宏。你唯一需要做的更改是显式use重新导出的redis包。

// In the case of deadpool-redis, bring the reexported crate into scope
use deadpool_redis::redis;

// Or if you are importing multiple things from redis, use redis::self
use deadpool_redis::{redis::{self, AsyncCommands}, Config, Runtime};

获取更多信息,请参阅deadpool-redis示例。

测试

您可以使用cargo test命令运行代码的单元测试。

cargo test

对于集成测试,您可以直接运行示例。您需要一个兼容RedisJSON的redis-server,端口为6379,推荐使用redis-stack docker镜像

docker run -d --rm -p 6379:6379 --name redis docker.io/redis/redis-stack
cargo test --examples
# cleanup the container
docker stop redis

覆盖率

对于覆盖率,您可以使用grcov。如果您还没有安装,请先安装llvm-tools-previewgrcov

rustup component add llvm-tools-preview
cargo install grcov

您需要导出一些标志来确保其正常运行。

export RUSTFLAGS='-Cinstrument-coverage'
export LLVM_PROFILE_FILE='.coverage/cargo-test-%p-%m.profraw'

最后,运行测试并生成输出。

cargo test
cargo test --examples
grcov .coverage/ -s . --binary-path ./target/debug/ -t html --branch --ignore-not-existing -o ./target/debug/coverage/

现在您可以在浏览器中打开./target/debug/coverage/index.html来查看覆盖率。

依赖项

约5MB
约127K SLoC