1 个不稳定版本
新版本 0.1.1 | 2024 年 8 月 12 日 |
---|
#1390 在 Web 编程
每月 下载 120 次
用于 rmemstore
10KB
100 行
rmemstore
快速、类型感知的数据结构缓存。
关于
rmemstore
类似于您可能使用过的其他缓存,如 redis,但它有一些不同之处。rmemstore
的主要目标是类型安全、快速,并且作为数据结构缓存非常有用。
当然,实用性是一个持续的过程,因为功能的发展需要时间。然而,rmemstore
是一个类型感知的数据结构存储,这意味着您可以存储映射的映射 - 服务器知道这意味着什么。
它现在很快。当需要淘汰时,rmemstore
使用新的筛子淘汰策略。在 10:1 的读写比下,11 年前的英特尔 i5 服务器上的 2 个线程能够每秒处理超过 330 万个操作。即使在被推到淘汰时。
rmemstore
基于 "安全" Rust 代码构建。它不依赖于微妙的技巧来获得速度。它确实使用标准的库,如出色的 tokio
,它们可能使用暗黑魔法,但它们是可信赖的。
rmemstore
使用裸 TCP - 没有应用程序框架。您的网络卡发送到或从 rmemstored
服务器传输的每个 0 和每个 1 都有一个直接目的。当有合适的替代方案时,发明一个新的看似可移植的线协议是一种虚幻的宏伟练习。考虑到这一点,rmemstore
使用 protosockets
,这是上述自大和实用主义之间的折中。
协议
到 rmemstored
的 tcp 流是一个标准、长度分隔的协议缓冲区 rmemstore.Rpc
结构流。这些消息携带一个 ID,rmemstored
使用该 ID 进行响应 - 可能是无序的。它是一个多线程、多路复用服务器。您可以根据自己的网络和 CPU 能力发送尽可能多的数据,尽可能快。
从 rmemstored
出发的 tcp 流是一个标准、长度分隔的协议缓冲区 rmemstore.Response
结构流。这些消息携带初始化响应的 Rpc 的 ID。每个 rmemstore.Rpc
都有一个相应的 rmemstore.Response
。
输入和输出流都是:varint
message
varint
message
[...]. 在消息之前的 varint 是消息的长度。所以一旦你读取了 varint
和 varint
的长度,你就有了完整的消息。
语言
Rust
你可以查看 rmem
来了解如何使用客户端。用法归结为3行
let mut configuration = rmemstore::ClientConfiguration::new();
let client = configuration.connect(args.host.to_string()).await?;
client.put("some key", "some value").await?;
你还可以放字典
client.put(
"some key",
HashMap::<&str, &str>::from_iter([
("hello", "world")
]),
).await?;
或者字符串和字典的字典,只要你愿意
client
.put(
"some key",
HashMap::<&str, MemstoreValue>::from_iter([
(
"hello",
MemstoreValue::String {
string: "world".to_string(),
},
),
(
"nested",
MemstoreValue::Map {
map: HashMap::from_iter([(
"inner".to_string(),
MemstoreValue::String {
string: "values".to_string(),
},
)]),
},
),
]),
)
.await?;
Bash
你可以使用 rmem
来存取。
对于字符串,输出稍微简短一些。
$ rmem put foo `{"string": "some value"}`
$ rmem get foo
some value
对于映射,交互有一些冗长,但它是类型化的!
$ rmem put foo '{"map": {"bar":{"map":{"baz":{"string": "haha"}, "other": {"string": "verbose"}}, "outer": {"string": "another"}}}}'
$ rmem get foo
{
"bar": {
"map": {
"baz": {
"string": "haha"
},
"other": {
"string": "verbose"
}
}
}
}
Python
不想使用Rust?任何能够通过TCP发送和接收协议缓冲区编码字节的工具或语言都可以使用 rmemstored
。参见 example-python
中的另一个语言的示例。请注意,由于Python没有公开Protobuf varint编码器,Python可能有点麻烦。
依赖
~0.3–2.3MB
~35K SLoC