【.Net】一文讲清楚SonnetDB 时序库的使用

什么是 SonnetDB?为何选择它?

SonnetDB 是由国内团队 IoTSharp 开源的一款时序数据库引擎,基于 C# / .NET 10 构建,采用对商业应用友好的 MIT 许可证 。它专为 IoT 物联网、工业控制、运维监控和实时分析 等场景而设计,堪称 .NET 生态在时序数据领域的一大突破。

GitHub地址: https://github.com/IoTSharp/SonnetDB

选择 SonnetDB 的理由,源于它解决的核心痛点:

  • 卓越的性能 :在i9-13900HX的基准测试中,其写入速度高达 180万点/秒 ,查询延迟仅在毫秒级(10万行范围查询为6.71ms),性能在多方面优于 SQLite、InfluxDB 等。
  • 零部署、低延迟 :作为一个"嵌入式优先"的数据库,它以类库形式集成在代码中,无需部署独立服务。这不仅实现了"零部署成本",也因进程内访问而带来了极低的数据读写延迟。

核心架构:它是如何工作的?

理解内部架构能帮你更好地进行配置和排错。SonnetDB 的四层存储架构如下图所示:
应用程序进程
SonnetDB 引擎
WAL

预写日志

(保证数据不丢失)
MemTable

内存表

(高并发写入缓冲)
Segment

不可变数据段

(SSTable风格)
Compaction

后台段压缩

(异步合并文件)

  • WAL (预写日志):所有写入操作会先追加到WAL,以保证数据在发生崩溃时不会丢失。同时,CRC 校验机制确保了数据的完整性。
  • MemTable (内存表):写入操作的缓冲区,新数据会先暂存在这里并进行排序。当它达到一定大小后,会被整体刷写到磁盘,这保证了高并发写入的性能。
  • Segment (不可变数据段):刷写到磁盘后的只读数据文件。这种SSTable风格的文件结构能加速范围查询。
  • Compaction (段压缩):一个后台异步任务,负责将多个小的 Segments 文件合并成更大的文件,同时清理掉被标记为删除的数据(Tombstone),以避免存储碎片。

为了高效管理数据的生命周期,SonnetDB 支持 Tombstone(逻辑删除)TTL(自动过期) 两种机制来回收存储空间。

快速开始:5分钟上手

1. 安装

SonnetDB 作为一个嵌入式库,目前主要通过 NuGet 包集成。虽然它的 GitHub 仓库暂未公开,但你可以通过搜索 SonnetDB 来安装(未来官方包名可能会更新)。后续,你也可以关注 IoTSharp 项目获取最新动态。

2. 基础使用

以下示例展示了如何创建数据库实例、写入数据和查询数据。

csharp 复制代码
using SonnetDB; // 引入命名空间

// 1. 创建或打开一个数据库实例(基于文件)
// 嵌入式设计,直接指定文件路径即可
var db = new SonnetDB("my_data.db");

// 2. 写入一条遥测数据
db.Write(new Telemetry 
{ 
    DeviceId = "sensor-001", 
    Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), 
    Value = 23.5 
});

// 3. 使用 LINQ 进行原生查询
var startTime = DateTimeOffset.UtcNow.AddHours(-1).ToUnixTimeMilliseconds();
var endTime   = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

var results = db.Query<Telemetry>()
    .Where(t => t.DeviceId == "sensor-001")
    .Where(t => t.Timestamp >= startTime && t.Timestamp <= endTime)
    .ToList();

// 4. 使用 LINQ 进行聚合查询,获取每日平均温度
var dailyAvg = db.Query<Telemetry>()
    .Where(t => t.DeviceId == "sensor-001" && t.Timestamp >= startTime && t.Timestamp <= endTime)
    .GroupBy(t => t.Timestamp.Date)
    .Select(g => new { Date = g.Key, Avg = g.Average(x => x.Value) })
    .ToList();

关键点SonnetDB 类提供了核心的写入(Write)和查询(Query<T>)方法。

进阶用法:深入体验特性

1. 使用 Span<T> 实现零拷贝读取

SonnetDB 使用 100% 托管代码 ,通过 Span<T> 等现代 C# 特性实现内存安全且高效的数据访问。

csharp 复制代码
// SonnetDB 内部运用 Span<T> 进行高效的二进制数据解析
public readonly struct DataPoint
{
    public long Timestamp { get; }
    public double Value { get; }

    public DataPoint(ReadOnlySpan<byte> buffer)
    {
        // 安全地解析二进制数据,避免了 unsafe 代码
        Timestamp = BinaryPrimitives.ReadInt64LittleEndian(buffer.Slice(0, 8));
        Value = BitConverter.ToDouble(buffer.Slice(8, 8));
    }
}
2. 在 IoTSharp 生态中集成

如果你是 IoTSharp 用户,SonnetDB 能无缝替代 InfluxDB 等数据库,作为平台的时序存储层。它的高性能和嵌入式特性非常适合边缘计算场景,可在工业边缘网关上本地缓存数据,实现离线数据不丢失。

csharp 复制代码
// 在设备端直接嵌入 SonnetDB,实现轻量级本地存储
var db = new SonnetDB("edge_gateway.db");

// 采集传感器数据并写入
foreach(var sensorData in edgeGateway.GetSensorData())
{
    db.Write(sensorData);
}
3. 数据生命周期管理

SonnetDB 提供了灵活的数据清理策略,建议结合实际业务需求进行配置。

  • 逻辑删除 (Tombstone):删除操作会先添加一个标记,后台 Compaction 时会物理清除数据,保证删除的幂等性和性能。
  • 设置 TTL (过期时间):可以为特定数据的保留时间进行配置,以自动清理旧数据、降低存储成本。

如何选择?SonnetDB 对比同类产品

为了帮你更客观地评估,这里将 SonnetDB 与几款主流时序数据库做了横向对比:

特性 SonnetDB InfluxDB TDengine TimescaleDB
部署模式 嵌入式 服务型 服务型 扩展型 (基于PostgreSQL)
核心写入性能 180万点/秒 ~20万点/秒 ~100万点/秒 ~50万点/秒
是否原生支持.NET ❌ 否 ❌ 否 ❌ 否
许可证 MIT MIT AGPL Apache 2.0
典型生态 IoTSharp 通用 工业物联网 PostgreSQL 生态
适用场景 边缘计算、嵌入式、.NET应用 监控系统、通用IoT 工业大数据、物联网 需要关系型与时序结合的场景

总结

SonnetDB 为 .NET 开发者在进行高性能时序数据处理时,提供了一个卓越的"嵌入式"选择。它的核心优势可以概括为:

  • 性能王者 :写入速度高达180万点/秒,毫秒级的查询延迟,能够轻松应对高吞吐场景。
  • .NET 原生100% C# 托管代码 实现,原生支持 LINQ 查询,API 设计完全符合 .NET 开发者习惯。
  • 极致轻量:嵌入式设计无需外部服务依赖,零运维成本,且资源占用极低。
相关推荐
雪飞鸿21 小时前
ArrayPoolWrapper简洁、安全的ArrayPool
c#·.net·.net core·原创
我是唐青枫1 天前
C#.NET MemoryMarshal 深入解析:零拷贝内存重解释、二进制读写与使用边界
c#·.net
步步为营DotNet1 天前
深入剖析.NET 11 中 Semantic Kernel 于智能后端集成的创新实践
前端·.net·easyui
喵叔哟1 天前
10.【.NET10 实战--孢子记账--产品智能化】--其余第三方包批量升级
人工智能·.net
武藤一雄1 天前
WPF中逻辑树(Logical Tree)与可视化树(Visual Tree)到底是什么
microsoft·c#·.net·wpf·.netcore
软泡芙1 天前
【.NET】创建一个ai聊天应用
人工智能·flask·.net
不会编程的懒洋洋1 天前
C# IDisposable 和 using
开发语言·笔记·机器学习·c#·.net·visual studio·c#基础
唐青枫1 天前
C#.NET MediatR 深入解析:进程内消息分发、CQRS、通知事件与管道行为实战
c#·.net