推荐一个.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.Core
2、示例代码
// 导入 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://eyangzhen.com/2612.html