#序列化-反序列化 #序列化 #Redis #resp3 #格式 #框架 #resp

deseresp

deseresp 是使用 serde 框架实现的 Redis RESP3 格式的序列化和反序列化器

10个版本

0.1.9 2022年6月28日
0.1.8 2022年6月25日
0.1.5 2022年5月26日
0.1.4 2022年4月19日

#1177 in 编码

Download history 5/week @ 2024-06-29 128/week @ 2024-07-27

每月133次下载

MIT/Apache

115KB
3K SLoC

Deseresp

Build status Crates.io

Deser-RESP 是使用 RESP3 格式的序列化和反序列化器实现,采用 serde 框架。

示例

简单用法

let buf = deseresp::to_vec(&(42, "the Answer")).unwrap();

assert_eq!(&buf, b"*2\r\n:42\r\n+the Answer\r\n");

let source: (usize, &str) = deseresp::from_slice(&buf).unwrap();
assert_eq!(source, (42, "the Answer"));

使用
BlobError

use deseresp::types::borrowed::BlobError;

let buf = deseresp::to_vec(&(42, BlobError::from("the Answer"))).unwrap();

assert_eq!(&buf, b"*2\r\n:42\r\n!10\r\nthe Answer\r\n");

let source: (usize, BlobError) = deseresp::from_slice(&buf).unwrap();
assert_eq!(source, (42, BlobError::from("the Answer")));

推送

use deseresp::types::Push;

let buf = deseresp::to_vec(&Push(("message", "channel", "data"))).unwrap();

assert_eq!(&buf, b">3\r\n+message\r\n+channel\r\n+data\r\n");

let source: Push<(&str, &str, &str)> = deseresp::from_slice(&buf).unwrap();
assert_eq!(source.into_inner(), ("message", "channel", "data"));

属性

use deseresp::types::WithAttribute;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct TtlMeta {
    ttl: usize
}
let val_with_attr = WithAttribute::new(TtlMeta { ttl: 3600}, 200);
let buf = deseresp::to_vec(&val_with_attr).unwrap();

assert_eq!(&buf, b"|1\r\n+ttl\r\n:3600\r\n:200\r\n");

let source: WithAttribute<TtlMeta, usize> = deseresp::from_slice(&buf).unwrap();
assert_eq!(source.into_inner(), (TtlMeta { ttl: 3600 }, 200));

高级用法,零拷贝网络解析

use bytes::{BytesMut, BufMut, Buf};
use serde::Deserialize;

let mut bytes_mut = BytesMut::new();
// loop
{
    // read from network
    bytes_mut.put(&b"*2\r\n:42\r\n+the Answer\r\n"[..]);
    let mut d = deseresp::Deserializer::from_slice(&bytes_mut);
    let r: (usize, &str) = Deserialize::deserialize(&mut d).unwrap();
    // do something with r
    assert_eq!(r, (42, "the Answer"));
    let consumed_bytes = d.get_consumed_bytes();
    // advance bytes_mut
    bytes_mut.advance(consumed_bytes);
}

依赖

~0.8–1.4MB
~32K SLoC