16个版本
0.3.7 | 2021年7月9日 |
---|---|
0.3.5 | 2021年6月30日 |
0.3.2 | 2020年9月21日 |
0.3.1 | 2020年7月19日 |
0.1.2 | 2020年3月31日 |
#56 in 数据库实现
54次每月下载
140KB
4K SLoC
IcbiaDB | 难以置信这是一个数据库
不建议用于生产环境
IcbiaDB是一个简单的嵌入式3合1(KV、表和JSON/BSON)数据库接口,具有即时反序列化功能。
然而,基本目标只是一个快速、可靠且易于使用的数据库实现,适用于通用场景,具有最少的准备、最少的依赖和低端计算机上的良好性能,能够无缝存储、操作和呈现原始数据结构和复杂数据结构,而无需太多麻烦。哦,它还附带免费啤酒。
功能
KV:
- 多种存储选项
- 元组、整数和字符串的原子操作
- 通过键、类型名称或值进行过滤,可使用或不使用正则表达式(见 "regex" crate功能)
表:
- 简单的宏和接口,用于创建、插入、选择和反序列化
- 与BvObject无缝过滤
JSON:尚未实现
示例
use serde::{Deserialize, Serialize};
use icbiadb::prelude::*;
use icbiadb::storage::BTreeMap;
#[derive(Serialize, Deserialize)]
struct Article {
title: String,
text: String,
}
fn main() -> std::io::Result<()> {
let mut db = icbiadb::kv::mem::<BTreeMap>();
// set, get
db.set("key:welcome", "Hello World!");
let v = db.get("key:welcome").unwrap(); // -> BvObject
if v == "Hello World!" || v == 100 {
println!("{:?} of type {}", v.extract::<String>(), v.type_name());
}
db.set("key:welcome", 100);
let key_welcome = db.get_value::<i32>("key:welcome");
if db.get("visited").is_some() {
db.incr("visitors");
}
// Atomic operations on tuple elements, requires same type and length.
db.set("my_tuple", (100, 100, "hello world!"));
let mut bvtuple = db.get_tuple("my_tuple").unwrap();
bvtuple.set(1, 111); // -> (100, 111, "hello world!")
bvtuple.set(2, "hello!!!!!!!");
bvtuple.value::<i32>(1); // -> 111
let article = Article {
title: "A title".to_string(),
text: "Hello World!".to_string(),
};
db.set("articles:0", &article);
// Seamless string bytes comparison, integers are atm converted natively(from_le_bytes)
db.filter(|(k, v)| v.type_name() == "IcbiaDB_tests::Article" || v.contains("this is a string"));
db.starts_with("calculations:")
.iter()
.filter(|(k, v)| k.contains(":super_calc:") && *v > 100.0 && *v < 200.0)
.collect::<Vec<_>>();
Ok(())
}
序列化和反序列化
序列化和反序列化不一定是慢操作,但对于低端计算机,宝贵的CPU时间可能会花在读取/解析下一个记录上,而不是大量反序列化数据,这是导致延迟的因素之一,就像在高级数据类型上的某些操作一样。让我们在它经过过滤、操作、排序和即将呈现之后处理一些愚蠢的事情,比如将字节转换为易于处理的类型!
... 如果在早期反序列化它没有更好的话,那也无所谓。换句话说,IcbiaDB 旨在 实现JIT、大量以及单次反序列化,在减少记录数量后。
不支持的数据类型
IcbiaDB将所有内容存储为简单的字节数组,一旦加载到内存中就不会对其进行任何修改,因此您可以使用所选语言将复杂结构序列化,以原始形式存储它,也许可以使用内置的字节实用程序或您自己的进行操作,而无需IcbiaDB的任何干扰。
注意
即将推出
- substr/srange(start, length)
- 更多受REDIS启发的功能
IcbiaDB支持其他语言
由于这是一个相当有趣的项目,如果我的时间允许,我计划将其扩展到其他语言。
- C ffi,尚未编写
- icbiadb-py
- Nodejs尚未编写,neon
- Ruby尚未编写,rutie
- Lua尚未编写,rlua
依赖项
~0.6–1.7MB
~36K SLoC