DC娱乐网

FASTER:快速、持久、可恢复的日志和键值存储+缓存开源.Net库

我是编程乐趣,一个10年.Net开发经验老程序员,点击右上方“关注”,每天为你分享开源项目和编程知识。私信回复:888,
我是编程乐趣,一个10年.Net开发经验老程序员,点击右上方“关注”,每天为你分享开源项目和编程知识。私信回复:888,领取.Net学习资料! 推荐一个.Net高性能开源库,方便实现需要键值存储的项目需求。 01 项目简介 FASTER是一个由微软开发的高性能、持久化、可恢复的并发日志和键值存储系统,支持 C# 和 C++ 语言。它包含两个核心组件: (1) FASTER Log 功能 一个高性能的并发、持久化、可恢复的日志库。 特点 支持低延迟的频繁提交操作,能快速饱和磁盘带宽。提供同步和异步接口。具备磁盘错误处理和校验和(checksums)功能。支持日志迭代和随机读取。(2) FASTER KV(Key-Value Store + Cache) 功能 一个并发的键值存储与缓存系统,支持数据量超过内存容量。 特点 专为点查询(point lookups)和高频更新设计。利用本地或云上的快速外部存储(如 SSD)来扩展内存。支持快速、非阻塞的检查点(checkpointing)机制,实现一致性的恢复。允许应用程序在性能和提交延迟之间进行权衡。02 主要特点 FASTER KV 中的无闩锁缓存优化索引。FASTER Log 中基于细粒度时代保护的快速持久可恢复追加日志,用于并发。FASTER KV 中独特的“混合记录日志”设计,将上述日志与就地更新相结合,以塑造内存工作集并保持性能。架构作为可嵌入多线程云应用程序的组件。基于组提交的异步非阻塞恢复模型。一种丰富的可扩展存储设备抽象,称为IDevice,具有本地存储、云存储、分层存储和分片存储的实现。新的高性能远程接口,使远程客户端可以通过 TCP 访问商店。03 使用方法 1、安装依赖库 Install-Package Microsoft.FASTER.Core2、示例代码 // 导入 FASTER 核心库 using FASTER.core; // 导入 System.Diagnostics 用于 Debug.Assert 断言 using System.Diagnostics; // 使用 "using var" 确保资源在作用域结束时正确释放(实现 IDisposable) // 1. 配置存储设置 // 创建 FasterKVSettings 实例,指定日志文件路径 // 这里的 "D:\\1.log" 是持久化日志文件的存储位置 // FASTER 使用日志结构存储来保证数据的持久性和恢复能力 using var settings = new FasterKVSettings("D:\\1.log"); // 2. 创建 FasterKV 存储实例 // 声明一个键(key)和值(value)类型均为 long 的 FasterKV 实例 // 该实例管理底层的日志、哈希表和内存管理 using var store = new FasterKV(settings); // 3. 创建会话(Session) // 通过 store 创建一个新的会话(Session) // SimpleFunctions 提供了一组默认的函数实现(如 Read, Upsert, RMW 等) // (a, b) => a + b 是一个自定义的“读-修改-写”(RMW)组合函数: // - 当执行 RMW 操作时,它会将现有值(a)与输入值(b)相加,并将结果作为新值 using var session = store.NewSession(new SimpleFunctions((a, b) => a + b)); // 定义测试用的变量 long key = 1; // 键 long value = 1; // 要插入的值 long input = 10; // 用于 RMW 操作的输入值 long output = 0; // 用于接收读取或 RMW 操作结果的输出变量 // 4. 执行读取操作(Read) // 尝试读取键为 1 的值 // 由于是首次操作,该键尚不存在,因此 output 通常保持为 0 或未定义(取决于实现) session.Read(ref key, ref output); // 5. 执行插入/更新操作(Upsert) // 将键值对 (1, 1) 插入或更新到存储中 // 如果键已存在,则更新其值;如果不存在,则插入新条目 session.Upsert(ref key, ref value); // 6. 再次读取验证 // 再次读取键为 1 的值 // 此时应能成功读取到之前插入的值 1 session.Read(ref key, ref output); // 断言:验证读取到的值是否等于我们插入的值 // 确保 Upsert 和 Read 操作正确执行 Debug.Assert(output == value); // 应该通过 (1 == 1) // 7. 执行第一次 RMW(Read-Modify-Write)操作 // RMW 是一种原子操作:读取当前值,应用函数 (a + b),然后写回新值 // 当前值为 1 (value),input 为 10,因此新值变为 1 + 10 = 11 session.RMW(ref key, ref input); // 8. 执行第二次 RMW 并获取输出 // 再次执行 RMW,当前值为 11,input 仍为 10,因此新值变为 11 + 10 = 21 // 同时,通过 ref output 参数获取操作前的旧值(即 11) session.RMW(ref key, ref input, ref output); // 断言:验证 RMW 操作的结果 // output 是第一次 RMW 后的值(11),加上两次 input(10 + 10 = 20),所以应为 1 + 20 = 21 // 注意:这里的断言逻辑基于 value (1) 加上两次 input (10 + 10) 的总和 Debug.Assert(output == value + 20); // 应该通过 (21 == 1 + 20)04 项目地址 https://github.com/microsoft/FASTER - End -