#内存数据库 #内存 #自由 #开源 #文件更改 #小型技术

airone

一个Rust库,提供简单的内存数据库,在更新时写入到追加事务文件中

27次发布

0.8.1 2024年5月28日
0.7.4 2023年9月14日
0.7.0 2023年7月16日
0.6.0 2023年3月5日
0.5.0 2022年11月4日

#147数据库接口

Download history 345/week @ 2024-05-26 30/week @ 2024-06-02 10/week @ 2024-06-09 2/week @ 2024-06-16 170/week @ 2024-07-28

每月170次下载

AGPL-3.0-or-later

71KB
1.5K SLoC

Airone

Airone是一个Rust库,提供简单的内存数据库,更新时写入到追加事务文件中,灵感来自Aral Balkan的JSDB

简而言之,它充当一个Vec<T>,但任何更改都会自动快速保存到文件中。

名称与“空气”或“一”无关,它仅来自意大利语单词“Airone”,意为“鹳”。因此,它必须按照[aiˈrone]来读。

  • 保存过程快
  • 将所有数据保存在内存中以快速读取

此库将内存中的结构体列表持久化到磁盘。内存中数据的任何更改都会以快速的方式自动保存到磁盘,避免完整导出整个列表。

AironeDb对象类似于结构体的简单数组,但它们会自动在后台将任何更改保存到磁盘。以下是一个示例

let mut my_airone_array = AironeDb::<MyStruct>::new().unwrap();

my_airone_array.push(    //  <-- This command
    MyStruct{field1: 5}  //      saves the new data to disk
);                       //      automatically

my_airone_array
    .get_mut(0).unwrap() //  <-- Get a mutable proxy
                         //      to the element at index 0
    .set_field1(10);     //  <-- A setter method is generated automatically.
                         //      The change is persisted to file.

println!("{}",
    my_airone_array[0].field1 // you can access it by index
);

Rust到C库桥已被移除,改为纯C库版本,它更小,简化了procmacro的可维护性,并更容易将其包含在任何兼容C的项目中。您可以在https://gitlab.com/MassiminoilTrace/airone_c找到它。

使用场景

Airone是为以下所有适用情况开发的

  • 无大数据:整个数据集应适合内存
  • 数据集必须持久化到磁盘
  • 在修改一些数据后,更改需要以快速的方式写入磁盘
  • 我们可以减慢程序启动时间,而不会产生任何相关影响
  • 无嵌套对象

以下是两个良好的使用场景示例

  • 小型Web服务器:数据可能会快速更改,并且完全可以适应内存。启动可能较慢,只要服务器在运行时性能良好。我提供了一个使用airone和Rocket服务器的外部模板
  • 一个离线GUI/TUI程序:由于Airone的只追加文件架构,您可以非常快速地存储数据修改,因此在保存过程中的界面冻结几乎不易察觉。这是一个非常基本的模板,它将Airone与Gtk3结合在一起。

这些限制对于某些使用场景可能是一个问题。现有的数据库添加了各种优化、缓存机制,并且非常复杂,以便能够处理如此大量的数据。
然而,当上述前提条件适用时,我们可以利用这些限制来简化源代码,使其更容易维护,并消除所有冗余软件。此外,限制对象嵌套使其与CSV风格文件兼容,确保您可以使用标准UNIX工具(如grepawk)操作数据。

上下文

Airone旨在帮助小技术的生产,这是一种与硅谷模式相反的技术构建方式。小技术具有接近零的数据收集、免费和开源的结构,以实现良好的透明度,没有指数级扩展的渴望,没有在处理大量数据时跟踪人们行为的欲望,总的来说,它有一个目标是保持简单和人性化。

文档

最基本的使用示例如下

use airone::prelude::*;

#[derive(AironeDbDerive)]
struct Foo
{
    pub field1: f64,
    pub field2: String,
    field3: Option<i32>
}

从这一点开始,您可以与类型为Foo的数据Vec进行交互,并自动将任何更改持久化到文件。

let mut db: AironeDb<Foo> = AironeDb::new()?;
// Add an element
db.push(
    struct Foo{field1: 0.0, field2: "Abc".to_string(), field3: None}
    );
db.get(0); // <-- returns a read only Option<&Foo>

let m = db.get_mut(0).unwrap()  // <-- returns a convenient 
    .set_field1(0.5);           //     writable wrapper of Foo
                                //     in an Option<T>

// Remove element at index 0
db.remove(0);

有关完整的使用说明和实现细节,请访问官方文档

版权

不是公有领域,请确保尊重许可条款。您可以在COPYING文件中找到许可文本。

版权 © 2022,2023,2024 Massimo Gismondi

本程序是免费软件:您可以在GNU Affero通用公共许可证的条款下重新分发和/或修改它,该许可证由自由软件基金会发布,无论是许可证的第3版,还是(根据您的选择)任何后续版本。

本程序的分发是希望它将是有用的,但没有任何保证;甚至没有关于其可销售性或适用于特定目的的暗示保证。有关详细信息,请参阅GNU通用公共许可证。

您应该已收到GNU Affero通用公共许可证的副本。如果没有,请参阅https://www.gnu.org/licenses/

在此项目中使用的外部库

本项目使用了一些外部库,如Cargo.toml文件中所述。

  • AGPL-3.0-or-later: airone_derive
  • MIT / Apache-2.0: proc-macro2, quote, syn
  • (MIT / Apache-2.0) AND Unicode-DFS-2016: unicode-ident

本项目使用的是您可以在COPYING文件中找到的许可证。

依赖关系

~265–720KB
~17K SLoC