FlashDB:一款专为 Flash 器件量身打造,超轻量级的嵌入式数据库

前言:为啥你需要一款高效嵌入式数据库
说实话,现在做 IoT 或嵌入式,动不动就有成千上万条数据要存,要查,文件系统又重,还得担心 Flash 寿命……折腾人。要是有个专门针对 Flash 优化、占用少、性能又杠杠的数据库,那才叫舒服。FlashDB 就是这么一个“量身定制”的小家伙。

FlashDB 是什么鬼?
FlashDB 是一款超轻量级的嵌入式数据库,专为 Flash 器件量身打造。它不依赖繁重的文件系统,直接在扇区层面做读写,既节省了 RAM,又能把 Flash 的写擦次数平衡到极致,延长寿命。
核心目标:

  • • 资源占用极低

  • • 快速插入、查询

  • • 强可靠性(掉电不怕丢数据)

它能帮你解决哪些痛点

  • • 占用少:一般几 KB 代码+零 RAM,最小影响主程序。

  • • 闪存寿命:内置 Wear-Leveling,自动均衡磨损。

  • • 掉电保护:写到一半断电,重启能自愈。

  • • 简单易用:KV 操作就像访问字典,TS 模式也能秒级写入+查询。

  • • 可分区/多实例:数据量大?分几个逻辑区,查询更快。

两种数据库模式,灵活又高效
FlashDB 提供两大模式,满足不同场景:

模式

用途说明

Key-Value

存配置、参数、小文件,操作简单、扩展性强

TimeSeries

存传感器数据、日志记录,带时间戳,高吞吐

  • • KVDB:两个类型(string、blob),支持增量升级。

  • • TSDB:每条记录带时间戳,可修改状态字段,便于管理。

安装和快速上手
整个库在 GitHub,克隆就能用:

git clone https://github.com/armink/FlashDB.git

然后把 components/flashdb 加到你的 RTOS/裸机工程里,配置一下分区、Flash 驱动。

示例:初始化一个 KVDB,存取操作简单到爆!

#include "fdb_kvdb.h"

int main(void){
/* 初始化 FlashDB */
    fdb_kvdb_t kv;
    fdb_kvdb_init(&kv,"kvdb_demo", PARTITION_USER,&flash_drv);
/* 写入键值对 */
    fdb_kvdb_set(&kv,"username","armink",strlen("armink"));
/* 读取 */
    char buf[32];
    size_t len =sizeof(buf);
    fdb_kvdb_get(&kv,"username", buf,&len);
    printf("user = %s\n", buf);
    return0;
}

TimeSeries 模式示例也差不多,调用 fdb_tsdb_append()、fdb_tsdb_query() 就行。

性能和占用——小身板大能量
我们跑了两个测试:

TSDB 写入/查询性能(W25Q64 外置 Flash)

操作

条数

总耗时(ms)

平均耗时

Append

1250

5000

4.00 ms

Query

1251

2218

1.77 ms

TSDB 写入/查询性能(STM32F2 内置 Flash)

操作

条数

总耗时(ms)

平均耗时

Append

13421

5000

0.37 ms

Query

13422

1475

0.11 ms

模块占用(STM32F4/IAR8.20)

模块

ro code (B)

ro data (B)

rw data (B)

fdb.o

276

232

1

fdb_kvdb.o

4584

356

1

fdb_tsdb.o

1160

236

—

fdb_utils.o

418

1024

—

可以看到,代码区连四位数都没破,跑得快还省空间。

优缺点一览

优点

缺点

极小的 Flash/RAM 占用

目前只支持扇区型 NOR/NAND

强大的 Wear-Leveling 和掉电保护

API 还在迭代,部分场景需适配

KV 与 TS 两种模式,场景覆盖全

需要对 Flash 分区做预先规划

开源 Apache-2.0,社区活跃

文档有时要多看几遍

总结:谁适合用 FlashDB
简单来说,做 IoT、智能家居、可穿戴设备、小型工业控制器,只要有 Flash 存储需求,想要低成本、高性能、可靠存储,就冲它!项目开源、轻量、文档齐全,上手快,社区 ook 也在日渐壮大。如果你正头疼嵌入式数据存储,不妨给 FlashDB 一试。

项目地址:https://github.com/armink/FlashDB

发表评论