1个不稳定版本
0.1.0 | 2023年11月2日 |
---|
在过程宏中排名第774
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的辅助工具,使用serde
和bincode
。
[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" }
基本用法
简单用法
最简单的方法是派生任何类型的结构的Serialize
、Deserialize
、FromRedisValue
、ToRedisArgs
...然后就这样!现在你可以使用常规的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-preview
和grcov
。
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