16 个版本 (8 个破坏性版本)
0.9.1 | 2022年2月22日 |
---|---|
0.8.0 | 2021年12月30日 |
0.4.2 | 2021年11月19日 |
#589 在 数据结构
每月下载 29 次
用于 6 crates
73KB
1.5K SLoC
msg-store
消息存储速度快且轻量,允许在带宽和磁盘容量有限的情况下按优先级转发消息。
入门
在 Cargo.toml 中
msg_store = "0.1.0"
在 src/main.rs 中
use msg_store::{ Packet, open };
let mut store = open();
let uuid = store.add(&Packet::new(1, "my message".to_string())).expect("Could not add msg");
let my_message = store.get(None, None);
// or
let my_message = store.get(None, Some(uuid))
- 消息将按最高优先级然后是最早状态转发。
- 消息将按最低优先级然后是最早状态销毁。
- 只有在存储达到最大字节大小限制后,消息才会被销毁。
- 整个存储有一个最大字节大小限制选项,每个单独的优先级
- 组也有。例如,开发者可以将存储的大小限制为 1,000 字节,同时将优先级组 1
- 限制为仅 500 字节,并让更高优先级不受限制(除了存储的限制之外。)
- 存储记录基本统计信息,例如计算已插入、删除或销毁的消息数量。
- 已删除的消息是在开发者使用 del 方法指令后删除的。
- 已销毁的消息是在插入或存储/组默认更新后自动销毁的,前提是已达到最大字节大小限制。
- 存储可以包含 4,294,967,295 个优先级。
示例
需要将四条消息转发到远程服务器。第一条消息放在优先级 1,第二条放在优先级 2,第三条消息放在优先级 1,第四条消息再次放在优先级 2,如下面的 Rust 示例和表格所示。
use msg_store::{
Packet,
open
};
let mut store = open();
store.add(&Packet::new(1, "msg 1".to_string())).expect("Could not add msg");
store.add(&Packet::new(2, "msg 2".to_string())).expect("Could not add msg");
store.add(&Packet::new(1, "msg 3".to_string())).expect("Could not add msg");
store.add(&Packet::new(2, "msg 4".to_string())).expect("Could not add msg");
let msg_2 = store.get(None, None);
优先级 1 | 优先级 2 |
---|---|
msg 1 | msg 2 |
msg 3 | msg 4 |
当调用 get 时,msg 2 将首先检索,因为它在最高优先级组中,并且也是该组中最旧的消息。第二个检索的消息将是 msg 4。
虽然这可能是默认设置,但它并不强制执行。开发者可以向get方法传递一个优先级来获取该组中的下一个消息,或者也可以传递uuid来获取所需的确切消息。
use msg_store::{
Packet,
open
};
let mut store = open();
let msg_1_uuid = store.add(&Packet::new(1, "msg 1".to_string())).expect("Could not add msg");
let msg_2_uuid = store.add(&Packet::new(2, "msg 2".to_string())).expect("Could not add msg");
let msg_3_uuid = store.add(&Packet::new(1, "msg 3".to_string())).expect("Could not add msg");
let msg_4_uuid = store.add(&Packet::new(2, "msg 4".to_string())).expect("Could not add msg");
let msg_2 = store.get(None, None).expect("Could not get msg");
let msg_1 = store.get(Some(1), None).expect("Could not get msg");
let msg_3 = store.get(None, Some(msg_3_uuid)).expect("Could not get msg");
另一方面,如果设置了最大字节数限制,第一个将被删除的消息是msg 1,因为它位于最低优先级的组中,并且是那个组中最旧的消息。第二个被删除的消息将是msg 3。
数据库后端
消息存储被设计成数据库无关,理论上可以与任何数据库作为后端一起工作,前提是开发者编写了粘合代码。
此库提供了Keeper特性,必须为任何后端插件实现。
其他插件可以在msg-store github页面找到