FASTER:快速、持久、可恢复的日志和键值存储+缓存,使用 C# 和 C++ 实现。

推荐一个.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://github.com/microsoft/FASTER

声明:来自编程乐趣,仅代表创作者观点。链接:https://eyangzhen.com/2612.html

编程乐趣的头像编程乐趣

相关推荐

关注我们
关注我们
购买服务
购买服务
返回顶部