#ring-buffer #queue #disk #lock-free #reader #page #thread

disk-ringbuffer

用于Franz实现的无锁磁盘环形缓冲区

8个版本 (5个重大更新)

0.5.0 2024年7月3日
0.4.0 2024年7月1日
0.3.1 2024年6月30日
0.2.1 2024年6月28日
0.0.1 2024年6月25日

#270 in 数据库实现

Download history 153/week @ 2024-06-21 662/week @ 2024-06-28 117/week @ 2024-07-05 52/week @ 2024-07-26 9/week @ 2024-08-02

每月下载量 61次
franz中使用

MIT许可证

25KB
559

磁盘环形缓冲区

这是一个极其简单的磁盘写入日志实现,它类似于环形缓冲区!它使用内存映射页来实现进程间、无锁的读写。它速度极快,但为了更好的效率(更少但更大的内存映射页)而占用较多的磁盘空间。

示例

fn seq_test() {
    // takes directory to use as ringbuf storage as input
    let (mut tx, mut rx) = new("test-seq").unwrap();

    // you can clone readers and writers to use in other threads!
    let tx2 = tx.clone();

    for i in 0..50_000_000 {
        tx.push(i.to_string());
    }

    for i in 0..50_000_000 {
        let m = rx.pop().unwrap().unwrap();
        assert_eq!(m, i.to_string());
    }
}

lib.rs:

磁盘环形缓冲区

这是一个极其简单的磁盘写入日志实现,它类似于环形缓冲区!它使用内存映射页来实现进程间、无锁的读写。它速度极快,但为了更好的效率(更少但更大的内存映射页)而占用较多的磁盘空间。

示例

use disk_ringbuffer::ringbuf;

fn example() {
// takes directory to use as ringbuf storage and the total number of pages to store as input.
// note that each page takes 80Mb and setting the max_pages to zero implies an unbounded queue
let (mut tx, mut rx) = ringbuf::new("test-example", 2).unwrap();

// you can clone readers and writers to use in other threads!
let tx2 = tx.clone();

for i in 0..500_000 {
tx.push(i.to_string());
}

for i in 0..500_000 {
let m = rx.pop().unwrap().unwrap();
assert_eq!(m, i.to_string());
}
}

发送者也是完全线程安全的!

use disk_ringbuffer::ringbuf::new;

fn thread_example() {

let (mut tx, mut rx) = new("test-thread-example", 2).unwrap();
let mut tx2 = tx.clone();

let t = std::thread::spawn(move || {
for i in 0..500_000 {
tx.push(i.to_string()).unwrap();
}
});

tx2.push("asdf").unwrap();

t.join().unwrap();
}

依赖关系

~0.5–3MB
~60K SLoC