当前位置: 首页 > article >正文

ZoneTree: 高性能ACID兼容的.NET有序键值数据库

推荐一个专门针对键值存储的开源数据库。

01 项目简介

ZoneTree基于.Net开发的开源键值数据库。它以其持久化存储、高性能处理、事务性操作和ACID合规性而著称。ZoneTree能够以内存数据库的形式运行,也可以在本地或云存储上进行数据持久化,提供了灵活性和可扩展性。

02 项目特点

**持久化存储:**支持将数据存储在内存中或持久化到本地和云存储,确保数据的安全性和可靠性。

**高性能:**作为一个高性能数据库,在数据处理上展现出了卓越的性能,特别是在高并发和大数据量处理方面。比Facebook的RocksDB快几倍,比SQLite快几百倍。

**事务性操作:**支持完整的事务操作,遵循ACID原则,确保数据操作的原子性、一致性、隔离性和持久性。

**内存或存储操作:**提供了在内存和磁盘之间的灵活选择,以适应不同的应用场景和性能需求。

03 模式与性能

ZoneTree提供4种WAL模式:

1、同步模式

  • 持久性:提供最大的数据持久性。

  • 写入速度:相对较慢。

  • 特点:在崩溃或断电情况下,确保已插入的数据不会丢失。

2、同步压缩模式

  • 持久性:相对较低。

  • 写入速度:比同步模式快。

  • 特点:压缩需要在数据块填满后才能追加到 WAL 文件中。可以设置周期性任务,将未压缩的尾部记录在指定间隔内持久化到单独位置。

3、异步压缩模式

  • 持久性:相对较低。

  • 写入速度:比同步模式快。

  • 特点:日志条目在单独的线程中排队等待写入,使用 WAL 文件中的压缩,并提供即时的尾部记录持久化。

4、无 WAL 模式

  • 性能:达到最大性能,因为 WAL 被完全禁用。

  • 数据存储:数据仍然可以通过树维护者自动或手动保存到磁盘。

以下是不同模式下插入性能:

在这里插入图片描述

04 使用方法

1、基本使用

using var zoneTree = new ZoneTreeFactory<int, string>()
   .OpenOrCreate();
zoneTree.Upsert(39, "Hello Zone Tree");

2、创建数据库

// 设置数据库的存储路径
var dataPath = "data/mydatabase";

// 使用 using 语句确保 ZoneTree 对象在使用完毕后能够正确关闭
using var zoneTree = new ZoneTreeFactory<int, string>()
    // 设置键的比较器
    .SetComparer(new Int32ComparerAscending())
    // 设置数据库文件的存储目录
    .SetDataDirectory(dataPath)
    // 设置键的序列化器
    .SetKeySerializer(new Int32Serializer())
    // 设置值的序列化器
    .SetValueSerializer(new Utf8StringSerializer())
    // 打开或创建数据库
    .OpenOrCreate();

// 在数据库中插入或更新键值对,操作是原子的(线程安全的),但是只针对单个可变段
zoneTree.Upsert(39, "Hello Zone Tree!");

// 尝试在所有段上执行原子添加或更新操作
// 如果键存在,则使用提供的函数更新值
// 这里的函数将字符串 "a" 与 "b" 拼接
zoneTree.TryAtomicAddOrUpdate(39, "a", 
    bool (ref string x) => 
    {
        x += "b"; // 将 "b" 添加到现有的字符串变量 x 的末尾
        return true; // 返回 true 以确认更新
    });

3、删除数据

using var zoneTree = new ZoneTreeFactory<int, int>()
  .SetIsValueDeletedDelegate((in int x) => x == -1)
  .SetMarkValueDeletedDelegate((ref int x) => x = -1)
  .OpenOrCreate();

4、遍历获取数据

 using var zoneTree = new ZoneTreeFactory<int, int>()
    .OpenOrCreate();
 using var iterator = zoneTree.CreateIterator();
 while(iterator.Next()) {
    var key = iterator.CurrentKey;
    var value = iterator.CurrentValue;
 }

5、事务操作

using var zoneTree = new ZoneTreeFactory<int, int>()
    .OpenOrCreateTransactional(); 

// 开始一个事务,使用 Fluent 风格的 API 链式调用配置事务的行为。
using var transaction = zoneTree
    .BeginFluentTransaction() // 开始一个新的事务。

    // 在事务中执行第一个操作:尝试插入或更新键为 3 的记录,其值为 9。
    // UpsertNoThrow 方法用于更新操作,如果更新失败则不抛出异常。
    .Do((tx) => zoneTree.UpsertNoThrow(tx, 3, 9))

    // 在事务中执行第二个操作:首先尝试获取键为 3 的值。
    // TryGetNoThrow 方法尝试获取值,如果操作被中止则返回 IsAborted 为 true。
    .Do((tx) => 
        {
            if (zoneTree.TryGetNoThrow(tx, 3, out var value).IsAborted)
                // 如果获取操作被中止,则整个事务也中止。
                return TransactionResult.Aborted();
            // 再次尝试更新键为 3 的记录,其值为 21。
            if (zoneTree.UpsertNoThrow(tx, 3, 21).IsAborted)
                // 如果更新操作被中止,则整个事务也中止。
                return TransactionResult.Aborted();
            // 如果所有操作都成功,则事务成功。
            return TransactionResult.Success();
        })

    // 设置挂起事务的重试次数为 100。
    .SetRetryCountForPendingTransactions(100)

    // 设置已中止事务的重试次数为 10。
    .SetRetryCountForAbortedTransactions(10);

// 提交事务,这是一个异步操作,使用 await 关键字等待操作完成。
await transaction.CommitAsync();

05 项目地址

https://github.com/koculu/ZoneTree

- End -

更多开源项目: https://github.com/bianchenglequ/NetCodeTop

我是编程乐趣,一个.Net开发经验老程序员,欢迎“关注”我,每天为你分享开源项目和编程知识。
也欢迎加入【.Net技术编程交流社区】,和大家共同学习交流!,点击加入:https://bbs.csdn.net/topics/613465368

推荐阅读

一个基于.Net的SVG图形开源操作库

mRemoteNG:一个基于.Net开发的支持多协议远程连接管理工具

MudBlazor:一个UI简洁美观漂亮的Blazor开源组件!

.NET日志库:Serilog、NLog、Log4Net等十大开源日志库大盘点!

Jot:方便.Net开发者状态和应用数据持久化的开源库


http://www.kler.cn/a/303557.html

相关文章:

  • The 3rd Universal CupStage 15: Chengdu, November 2-3, 2024(2024ICPC 成都)
  • 11.13机器学习_线性回归
  • RK3568平台(I2C篇)i2c_transfer接口详解
  • 【Pikachu】任意文件上传实战
  • 【MySQL 保姆级教学】详细讲解视图--(15)
  • 0x00基础算法 -- 0x05 排序
  • 使用vue2+axios+chart.js画折线图 ,出现 RangeError: Maximum call stack size exceeded 错误
  • 算法提高模板LCA
  • Unity Behavior Designe 可视化有限状态机(Composites篇)
  • Docker和Docker-compose
  • LSS如何创建视锥
  • HAL库学习梳理——UART
  • HarmonyOS NEXT应用开发性能实践总结
  • 太牛了!顺丰丰语大语言模型:已应用于20余个场景
  • 数据结构实验1
  • 电力系统调度控制台的功能有哪些
  • 【devops】devops-git之介绍以及日常使用
  • Winform中引入WPF控件后键盘输入无响应
  • Vue.js 中的 DOM 更新之后执行某些操作
  • uniapp与webview直接进行传值
  • vscode ssh离线远程连接ubuntu调试
  • python学习第九节:爬虫实战-抓取地址库
  • C语言 12 函数
  • Java二级信息收集
  • yarn webpack脚手架 react+ts搭建项目
  • ELK 架构中 ES 性能优化