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开发者状态和应用数据持久化的开源库

相关推荐
冉冰学姐1 小时前
SSM装修服务网站5ff59(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架·装修服务网站
库库8391 小时前
Redis分布式锁、Redisson及Redis红锁知识点总结
数据库·redis·分布式
沧澜sincerely1 小时前
Redis 缓存模式与注解缓存
数据库·redis·缓存
Elastic 中国社区官方博客2 小时前
Elasticsearch 推理 API 增加了开放的可定制服务
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
nzxzn2 小时前
MYSQL第二次作业
数据库·mysql
核桃杏仁粉3 小时前
excel拼接数据库
数据库·oracle·excel
TiAmo zhang3 小时前
SQL Server 2019实验 │ 设计数据库的完整性
数据库·sqlserver
冻咸鱼4 小时前
MySQL的CRUD
数据库·mysql·oracle
Funny Valentine-js4 小时前
团队作业——概要设计和数据库设计
数据库
CodeJourney.4 小时前
SQL提数与数据分析指南
数据库·信息可视化·数据分析