#嵌入式数据库 #数据库 #反序列化 #键值存储 #序列化 #数据库接口 #kv

icbiadb

难以置信这是一个数据库 | 简单的嵌入式3合1数据库

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 数据库实现

Download history 54/week @ 2024-07-30

54次每月下载

MIT 协议

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支持其他语言

由于这是一个相当有趣的项目,如果我的时间允许,我计划将其扩展到其他语言。

依赖项

~0.6–1.7MB
~36K SLoC