14个版本

0.1.4 2023年4月10日
0.1.3 2022年4月11日
0.1.2 2021年12月1日
0.1.1 2021年2月1日
0.0.0 2020年1月5日

#91 in 并发

Download history 205/week @ 2024-03-11 79/week @ 2024-03-18 74/week @ 2024-03-25 193/week @ 2024-04-01 68/week @ 2024-04-08 98/week @ 2024-04-15 103/week @ 2024-04-22 113/week @ 2024-04-29 78/week @ 2024-05-06 89/week @ 2024-05-13 113/week @ 2024-05-20 97/week @ 2024-05-27 97/week @ 2024-06-03 108/week @ 2024-06-10 365/week @ 2024-06-17 76/week @ 2024-06-24

652次每月下载
18 个crates中使用 (5个直接使用)

Apache-2.0/MIT

160KB
4K SLoC

事务系统和数据网格的支柱

Build Status Latest Version Rust Documentation

Lever是一个用于编写事务性系统(尤其是内存数据)的库。它由多个部分组成

  • index:索引和查找结构
  • stats:统计结构
  • sync:事务性系统的同步原语
  • table:由事务算法支持的多种KV表类型
  • txn:事务原语和管理

Lever使用MVCC模型来管理并发。它为事务端点、数据库和系统提供内存数据存储的构建块。在不牺牲故障转移机制的情况下,未阻塞的执行路径是lever的主要目标。

Lever提供STM、无锁、无等待同步原语以及各种其他工具,以简化编写事务性内存系统。

同步

同步原语,允许用户编写并发任务结构。Lever没有运行时或异步代码。整个库基于POSIX线程和非绑定IO。也就是说,sync包中可以使用的这些结构

  • 无锁ReentrantRwLock
  • 自旋锁
  • 公平锁

表格

Lever的表格系统可以像这样使用

use lever::prelude::*;
use std::sync::Arc;

fn main() {
    let lotable: Arc<LOTable<String, u64>> = Arc::new(LOTable::new());

    // RW from 1_000 threads concurrently.
    let thread_count = 1_000;
    let mut threads = vec![];

    for thread_no in 0..thread_count {
        let lotable = lotable.clone();

        let t = std::thread::Builder::new()
            .name(format!("t_{}", thread_no))
            .spawn(move || {
                let key = format!("{}", thread_no);
                lotable.insert(key.clone(), thread_no);
                let _ = lotable.get(&key).unwrap();
            })
            .unwrap();

        threads.push(t);
    }

    for t in threads.into_iter() {
        t.join().unwrap();
    }
}

请注意,Lever带有MVCC。MVCC完全使用BOCC风格实现,用于乐观锁定。Lever正在积极开发中,其他事务解决算法和并发控制机制也在积极开发中。

事务系统

事务系统有几个原语。它们是 begincommit 以及在执行过程中管理事务的各种方法。

示例事务可能如下所示

use lever::prelude::*;

let mut customers = TVar::new(123_456);

txn.begin(|t| {
    let mut churned = t.read(&customers);
    churned += 1;
    t.write(&mut customers, churned);
});

println!("I have {} customers right now. I gained 1.", customers.get_data());

有关更多示例,请访问 示例 目录。

性能

初始基准测试显示,对于各种工作负载,吞吐量非常高。

基准测试中将工作负载分为

  • 来自8个并发线程的纯读操作
  • 来自8个并发线程的80-20读/写混合操作
  • 来自8个并发线程的纯写操作

Lever性能出色。例如,Lever的表实现在大约1.9秒内完成了2500万次操作。整个系统已在生产中使用并持续改进。此crate汇集了许多原语、工具、结构和类似的东西。您可以自己尝试基准测试。基准测试代码已包含在内。

用户注意事项

请注意,事务在其代码路径中永远不会继承繁重的工作,因为它们主要是为了访问共享内存以及由其代码路径成功启用的并发。

隔离是分开到线程中,而不是全局内存中。这就是为什么它非常快。

回滚是自动的,它不会干扰您的程序,或退出。将会有一个结合了致命终止的系统。这项工作正在进行中。

待办事项

  • 致命终止
  • 其他并发方案
  • 各种冲突解决策略。
  • 网格通信
  • ...

许可证

您可以选择在以下许可证下使用:[Apache License, Version 2.0](https://github.com/vertexclique/lever/blob/719625d33e79e3766a9313e62be79491b4f1a84d/LICENSE-APACHE) 或 [MIT license](https://github.com/vertexclique/lever/blob/719625d33e79e3766a9313e62be79491b4f1a84d/LICENSE-MIT)。
除非您明确声明,否则您根据Apache-2.0许可证定义的任何有意提交以包含在此crate的贡献,均应按上述方式双许可,无需任何额外条款或条件。

依赖项

~1.6–2.6MB
~49K SLoC