轻量级嵌入式数据库-FlashDB


FlashDB 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB 结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。
A lightweight database that supports key-value and time series data | 一款支持 KV 数据和时序数据的轻量级数据库,采用C语言开发并在Apache 2.0协议下授权。
FlashDB 提供两种数据库模式:
键值数据库:是一种非关系数据库,它将数据存储为键值(Key-Value)对集合,其中键作为唯一标识符。KVDB 操作简洁,可扩展性强。
时序数据库:时间序列数据库(Time Series Database , 简称 TSDB),它将数据按照 时间顺序存储。TSDB 数据具有时间戳,数据存储量大,插入及查询性能高。
使用场景
如今物联网产品种类越来越多,运行时产生的数据种类及总量及也在不断变大。FlashDB 提供了多样化的数据存储方案,不仅资源占用小,并且存储容量大,非常适合用于物联网产品。下面是主要应用场景:
键值数据库 :
产品参数存储
用户配置信息存储
小文件管理
时序数据库 :
存储动态产生的结构化数据:如湿度传感器采集的环境监测信息,智能手环实时记录的人体健康信息等
记录运行日志:存储产品历史的运行日志,异常告警的记录等
主要特性
资源占用极低,内存占用几乎为 0 ;
支持多分区,多实例。数据量大时,可细化分区,降低检索时间;
支持磨损平衡 ,延长 Flash 寿命;
支持掉电保护功能,可靠性高;
支持字符串及 blob 两种 KV 类型,方便用户操作;
支持 KV 增量升级 ,产品固件升级后, KVDB 内容也支持自动升级;
支持修改每条 TSDB 记录的状态,方便用户进行管理。
性能及资源占用
TSDB 性能测试1 (nor flash W25Q64)
msh />tsl bench
Append 1250 TSL in 5 seconds, average: 250.00 tsl/S, 4.00 ms/per
Query total spent 2218 (ms) for 1251 TSL, min 1, max 2, average: 1.77 ms/per
插入平均:4 ms,查询平均:1.8 ms
TSDB 性能测试2 (stm32f2 onchip flash)
msh />tsl bench
Append 13421 TSL in 5 seconds, average: 2684.20 tsl/S, 0.37 ms/per
Query total spent 1475 (ms) for 13422 TSL, min 0, max 1, average: 0.11 ms/per
插入平均:0.37 ms,查询平均:0.12 ms
资源占用 (stm32f4 IAR8.20)
Module ro code ro data rw data
------ ------- ------- -------
fdb.o 276 232 1
fdb_kvdb.o 4 584 356 1
fdb_tsdb.o 1 160 236
fdb_utils.o 418 1 024
上面是 IAR 的 map 文件信息,可见 FlashDB 的资源占用非常低。
移植
FlashDB 底层的 Flash 管理及操作依赖于 RT-Thread 的 FAL (Flash Abstraction Layer) Flash 抽象层开源软件包,该开源库也支持运行在裸机平台。所以只需要将所用到的 Flash 对接到 FAL ,即可完成整个移植工作。
示例
FlashDB 提供了主要功能的示例,直接加入工程即可运行,并具有一定的参考性。
最新版本:1.0
新增自动化测试
新增基于 Travis CI 的自动化构建检查及自动化测试,保证每次代码提交不仅编译通过,功能也都经过 qemu 模拟器环境下的测试验证。
新增 KV 迭代器的 API
方便实现对 KVDB 中的全部 KV 进行遍历,感谢网友 eggcar 的贡献。
新增 contorl 控制函数
通过 fdb_kvdb_control 及 fdb_tsdb_control 的控制函数,用户可以实现一些对于数据库的控制管理功能。比如:设置 加锁和解锁 函数、设置 扇区大小 等,对于 TSDB 的 control 函数,用户还可以
设置让数据库不启动处理滚动写入模式,这样如果数据库满,最旧的数据也不会删除,但无法插入新的数据
获取上次的使用的时间戳,这样即便系统中没有 RTC ,也可以使用软件模拟时间戳功能,适用于一些对于 实时时间不敏感的场景。
最新版本:2.x
自 V2.0 后,大幅提升了数据库的性能(尤其是 GC)、稳定性和兼容性,新增了一些重要的功能,如:反向迭代器、数据库扩容、垃圾回收改进、完整性检查和 64&128 位写粒度支持,并修复了多个运行时错误和潜在的存储问题。打磨了一年多时间的开发,于2024年10月上旬正式发布了 V2.1.1 版本,该版本是个 BUG 修正版本,如有需要可以尽快升级。
自 V2.0 开始的更新日志如下:
1. KVDB(键值数据库):
性能优化与错误修复:
修复运行时错误、警告和首次运行时的锁定问题
修复空指针解引用问题
改进缓存清理机制:在设置键值对为默认值之前清除缓存
改善垃圾回收(GC)算法,解决某些情况下的收集失败问题
支持 128 位写粒度、缓存性能优化,垃圾回收速度提升 2 倍
新增 KVDB 完整性检查 API 及数据库扩展功能
优化缓存算法:首次找到键时的缓存处理改进
添加部分 GC 功能以减少 GC 时间
修复写入失败问题和其他已知问题
2. TSDB(时间序列数据库):
错误修复:
修复读取最后一个有效时间序列日志(TSL)的问题
修复在电源异常断电时的闪存覆盖问题
功能增强:
添加反向迭代器功能、改进 TSDB 测试用例
3. 通用改进:
错误修复:
修复错误代码返回不正确的问题
关闭文件流指针时使用 fclose() 进行处理
功能增强:
Zephyr 系统:添加外部模块支持
改进对齐处理(FDB_ALIGN,FDB_ALIGN_DOWN)
闪存支持:
支持擦除后为 0 的闪存,如 TC397 芯片上的内部闪存
自动化与测试改进:
改进 CI 自动化测试、KVDB 和 TSDB 的测试用例
优化扇区迭代功能,迭代顺序从最旧到最新
4. Demo 支持更新:
ESP32 支持:
添加 ESP32 上的 SPI 闪存演示,支持 IDF 5.x 构建环境
STM32 支持:
添加 STM32L4 内部芯片的 FAL 闪存驱动
项目主页:https://github.com/armink/FlashDB
A lightweight database that supports key-value and time series data | 一款支持 KV 数据和时序数据的轻量级数据库,采用C语言开发并在Apache 2.0协议下授权。
FlashDB 提供两种数据库模式:
键值数据库:是一种非关系数据库,它将数据存储为键值(Key-Value)对集合,其中键作为唯一标识符。KVDB 操作简洁,可扩展性强。
时序数据库:时间序列数据库(Time Series Database , 简称 TSDB),它将数据按照 时间顺序存储。TSDB 数据具有时间戳,数据存储量大,插入及查询性能高。
使用场景
如今物联网产品种类越来越多,运行时产生的数据种类及总量及也在不断变大。FlashDB 提供了多样化的数据存储方案,不仅资源占用小,并且存储容量大,非常适合用于物联网产品。下面是主要应用场景:
键值数据库 :
产品参数存储
用户配置信息存储
小文件管理
时序数据库 :
存储动态产生的结构化数据:如湿度传感器采集的环境监测信息,智能手环实时记录的人体健康信息等
记录运行日志:存储产品历史的运行日志,异常告警的记录等
主要特性
资源占用极低,内存占用几乎为 0 ;
支持多分区,多实例。数据量大时,可细化分区,降低检索时间;
支持磨损平衡 ,延长 Flash 寿命;
支持掉电保护功能,可靠性高;
支持字符串及 blob 两种 KV 类型,方便用户操作;
支持 KV 增量升级 ,产品固件升级后, KVDB 内容也支持自动升级;
支持修改每条 TSDB 记录的状态,方便用户进行管理。
性能及资源占用
TSDB 性能测试1 (nor flash W25Q64)
msh />tsl bench
Append 1250 TSL in 5 seconds, average: 250.00 tsl/S, 4.00 ms/per
Query total spent 2218 (ms) for 1251 TSL, min 1, max 2, average: 1.77 ms/per
插入平均:4 ms,查询平均:1.8 ms
TSDB 性能测试2 (stm32f2 onchip flash)
msh />tsl bench
Append 13421 TSL in 5 seconds, average: 2684.20 tsl/S, 0.37 ms/per
Query total spent 1475 (ms) for 13422 TSL, min 0, max 1, average: 0.11 ms/per
插入平均:0.37 ms,查询平均:0.12 ms
资源占用 (stm32f4 IAR8.20)
Module ro code ro data rw data
------ ------- ------- -------
fdb.o 276 232 1
fdb_kvdb.o 4 584 356 1
fdb_tsdb.o 1 160 236
fdb_utils.o 418 1 024
上面是 IAR 的 map 文件信息,可见 FlashDB 的资源占用非常低。
移植
FlashDB 底层的 Flash 管理及操作依赖于 RT-Thread 的 FAL (Flash Abstraction Layer) Flash 抽象层开源软件包,该开源库也支持运行在裸机平台。所以只需要将所用到的 Flash 对接到 FAL ,即可完成整个移植工作。
示例
FlashDB 提供了主要功能的示例,直接加入工程即可运行,并具有一定的参考性。
最新版本:1.0
新增自动化测试
新增基于 Travis CI 的自动化构建检查及自动化测试,保证每次代码提交不仅编译通过,功能也都经过 qemu 模拟器环境下的测试验证。
新增 KV 迭代器的 API
方便实现对 KVDB 中的全部 KV 进行遍历,感谢网友 eggcar 的贡献。
新增 contorl 控制函数
通过 fdb_kvdb_control 及 fdb_tsdb_control 的控制函数,用户可以实现一些对于数据库的控制管理功能。比如:设置 加锁和解锁 函数、设置 扇区大小 等,对于 TSDB 的 control 函数,用户还可以
设置让数据库不启动处理滚动写入模式,这样如果数据库满,最旧的数据也不会删除,但无法插入新的数据
获取上次的使用的时间戳,这样即便系统中没有 RTC ,也可以使用软件模拟时间戳功能,适用于一些对于 实时时间不敏感的场景。
最新版本:2.x
自 V2.0 后,大幅提升了数据库的性能(尤其是 GC)、稳定性和兼容性,新增了一些重要的功能,如:反向迭代器、数据库扩容、垃圾回收改进、完整性检查和 64&128 位写粒度支持,并修复了多个运行时错误和潜在的存储问题。打磨了一年多时间的开发,于2024年10月上旬正式发布了 V2.1.1 版本,该版本是个 BUG 修正版本,如有需要可以尽快升级。
自 V2.0 开始的更新日志如下:
1. KVDB(键值数据库):
性能优化与错误修复:
修复运行时错误、警告和首次运行时的锁定问题
修复空指针解引用问题
改进缓存清理机制:在设置键值对为默认值之前清除缓存
改善垃圾回收(GC)算法,解决某些情况下的收集失败问题
支持 128 位写粒度、缓存性能优化,垃圾回收速度提升 2 倍
新增 KVDB 完整性检查 API 及数据库扩展功能
优化缓存算法:首次找到键时的缓存处理改进
添加部分 GC 功能以减少 GC 时间
修复写入失败问题和其他已知问题
2. TSDB(时间序列数据库):
错误修复:
修复读取最后一个有效时间序列日志(TSL)的问题
修复在电源异常断电时的闪存覆盖问题
功能增强:
添加反向迭代器功能、改进 TSDB 测试用例
3. 通用改进:
错误修复:
修复错误代码返回不正确的问题
关闭文件流指针时使用 fclose() 进行处理
功能增强:
Zephyr 系统:添加外部模块支持
改进对齐处理(FDB_ALIGN,FDB_ALIGN_DOWN)
闪存支持:
支持擦除后为 0 的闪存,如 TC397 芯片上的内部闪存
自动化与测试改进:
改进 CI 自动化测试、KVDB 和 TSDB 的测试用例
优化扇区迭代功能,迭代顺序从最旧到最新
4. Demo 支持更新:
ESP32 支持:
添加 ESP32 上的 SPI 闪存演示,支持 IDF 5.x 构建环境
STM32 支持:
添加 STM32L4 内部芯片的 FAL 闪存驱动
项目主页:https://github.com/armink/FlashDB