FlashDB嵌入式数据库

一、驱动层:SFUD(Serial Flash Universal Driver) 是一款开源的串行 SPI Flash 通用驱动库
二、中间层:FAL(FLASH ABSTRACTION LAYER))FLASH 抽象层
三、应用层:FlashDB(FlashDB 是一款超轻量级的嵌入式数据库)
后记1:FlashDB嵌入式数据库之TSDB数据存储解析


FlashDB嵌入式数据库

  • 什么是FlashDB
  • 移植
  • 总结

什么是FlashDB

先截一段官网的信息大家看一下哈
FlashDB 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB 结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。

FlashDB 提供两种数据库模式:

键值数据库 :是一种非关系数据库,它将数据存储为键值(Key-Value)对集合,其中键作为唯一标识符。KVDB 操作简洁,可扩展性强。
时序数据库 :时间序列数据库 (Time Series Database , 简称 TSDB),它将数据按照 时间顺序存储 。TSDB 数据具有时间戳,数据存储量大,插入及查询性能高。
使用场景
如今,物联网产品种类越来越多,运行时产生的数据种类及总量及也在不断变大。FlashDB 提供了多样化的数据存储方案,不仅资源占用小,并且存储容量大,非常适合用于物联网产品。下面是主要应用场景:

键值数据库 :
产品参数存储
用户配置信息存储
小文件管理
时序数据库 :
存储动态产生的结构化数据:如 温湿度传感器采集的环境监测信息,智能手环实时记录的人体健康信息等
记录运行日志:存储产品历史的运行日志,异常告警的记录等
主要特性
资源占用极低,内存占用几乎为 0 ;
支持 多分区,多实例 。数据量大时,可细化分区,降低检索时间;
支持 磨损平衡 ,延长 Flash 寿命;
支持 掉电保护 功能,可靠性高;
支持 字符串及 blob 两种 KV 类型,方便用户操作;
支持 KV 增量升级 ,产品固件升级后, KVDB 内容也支持自动升级;
支持 修改每条 TSDB 记录的状态,方便用户进行管理;

看到这里是不是已经有一个大概了解了,本人也查过一些其他的嵌入式使用的数据库,但是基本上都是Linux上使用的,对资源还是有一定要求的,在单片机这个级别上使用还是不现实的。

上下源作者的开源链接: https://gitee.com/Armink/FlashDB.
膜拜一下armink大神。
个人理解:其实数据库基本就是 增、删、改、查。增是最简单的,改删查就需要花点心思了。
看了下数据库,API接口还是很丰富的,比如遍历整个数据库和按时间戳检索数据库;以及修改数据库,删除数据库,还增加了扇区的平衡和磨平。基本上功能都包括了,个人以前做项目的时候也想过存取,最后还是没有很好的解决快速检索的功能,后期打算看下底层,专门写一下这一块的处理逻辑。

移植

  • FlashDB的移植是建立的Fal,flash抽象层的基础上使用的,官方给的demo也是如此,如果fal还没移植好,看上一篇文章
  • 一样的先下源码FlashDB嵌入式数据库_第1张图片
    打开demos目录下有多个工程
  • 个人用的是spi-flash,所以选择stm32f405rg_spi_flash这个工程
  • 把源码加入工程之后
    FlashDB嵌入式数据库_第2张图片

完成后就这个样子

  • 然后修改一下配置文件fdb_cfg.h文件
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#define FAL_DEBUG 1		//启动打印
#define FAL_PART_HAS_TABLE_CFG	//启动设备表
#define FAL_USING_SFUD_PORT	//使用sfud通用串行flash

/* ===================== Flash device Configuration ========================= */
extern struct fal_flash_dev nor_flash0;

/* flash device table */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &nor_flash0,                                                     \
}

/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE                                                                 \
{                                                                                      \
    {FAL_PART_MAGIC_WORD,  "fdb_tsdb1",       "norflash0",           0, 1024*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "fdb_kvdb1",       "norflash0",   1024*1024, 1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */

#endif /* _FAL_CFG_H_ */

运行一下看下日志

FlashDB嵌入式数据库_第3张图片
中间太长了,省略把
FlashDB嵌入式数据库_第4张图片
可以发现第一次运行会初始化一次flash,应该是在扇区头写入了一些标记
还可以发现最后写入了二条数据到数据库中

接着在复位一次
FlashDB嵌入式数据库_第5张图片

这一次的日志简单很多,没有了初始化的过程,第一次真的好慢,差点都以为进死循环了

[FlashDB][sample][kvdb][basic] ==================== kvdb_basic_sample ====================
[FlashDB][sample][kvdb][basic] get the 'boot_count' value is 1
[FlashDB][sample][kvdb][basic] set the 'boot_count' value to 2

这里记录了启动次数,一共启动了二次

[FlashDB][sample][tsdb] ==================== tsdb_sample ====================
[FlashDB][sample][tsdb] append the new status.temp (36) and status.humi (85)
[FlashDB][sample][tsdb] append the new status.temp (38) and status.humi (90)
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 3, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 4, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 3, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 4, temp: 38, humi: 90
[FlashDB][sample][tsdb] query count is: 2
[FlashDB][sample][tsdb] set the TSL (time 1) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 2) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 3) status from 2 to 3
[FlashDB][sample][tsdb] set the TSL (time 4) status from 2 to 3
[FlashDB][sample][tsdb] ===========================================================

一共写入了4条数据,分二次写入的,且遍历之后打印出来。

总结

移植算是结束了,也跟着日志理了一遍。API函数还是比较齐全的,使用也还算方便,看了作者介绍这个库也有几年历史了,更新了5个大版本了。打算看下底层,深入理解一下再和大家分享。
三部曲讲完了,还有一个后续的连接,链接: TSDB方式存储解析

你可能感兴趣的:(big,data,数据库,FlashDB)