4个版本

0.2.2 2021年5月5日
0.2.1 2021年5月5日
0.2.0 2021年5月5日
0.1.0 2021年4月28日

284 in 数据库实现

MIT 许可证

39KB
879 代码行

Prevayler-rs

这是Klaus Wuestefeld在Rust中提出的一种系统普遍性的简单实现。其他例子包括Java的prevayler和Clojure的prevayler-clj

想法是将所有对普遍数据的修改保存到一个重做日志中。如果系统重新启动,它将重新应用重做日志中的所有事务,恢复系统状态。系统还可以不时地写入快照,以加速恢复过程。

以下是一个示例程序,该程序使用u8创建一个普遍状态,增加其值,将值打印到屏幕上,然后关闭程序。

use prevayler_rs::{
    error::PrevaylerResult,
    PrevaylerBuilder,
    Prevayler,
    serializer::JsonSerializer,
    Transaction
};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct Increment {
    increment: u8
}

impl Transaction<u8> for Increment {
    fn execute(self, data: &mut u8) {
        *data += self.increment;
    }
}

#[async_std::main]
async fn main() -> PrevaylerResult<()> {
    let mut prevayler: Prevayler<Increment, _, _> = PrevaylerBuilder::new()
      .path(".")
      .serializer(JsonSerializer::new())
      .data(0 as u8)
      .build().await?;
    prevayler.execute_transaction(Increment{increment: 1}).await?;
    println!("{}", prevayler.query());
    Ok(())
}

在大多数情况下,你可能需要不止一个事务。我们现在必须使用一个枚举作为主事务,该事务将被保存到重做日志中。然后所有执行的事务都将转换为它。

有关更多示例,请参阅项目测试

依赖关系

~7–19MB
~243K SLoC