FlashDB简介
FlashDB是一款高度优化的嵌入式数据库,专注于提供嵌入式产品的数据存储解决方案。与传统的基于文件系统的数据库不同,FlashDB充分利用Flash存储的特性,以确保出色的性能和可靠性。在占用极少资源的同时,它还尽可能地延长了Flash的使用寿命。
FlashDB提供两种主要数据库模式:
-
键值数据库:这是一种非关系型数据库,它以键值对的形式存储数据,其中键是唯一标识符。键值数据库操作简洁高效,且具有很强的可扩展性。 -
时序数据库:这是一种时间序列数据库,它按照时间顺序存储数据。时序数据库的数据带有时间戳,适合存储大量数据,并具有出色的插入和查询性能。
欲了解更多信息,请访问项目链接:FlashDB
应用场景
随着物联网产品种类的增加,运行时产生的数据种类和总量也在不断增加。FlashDB提供了多样化的数据存储解决方案,具有占用资源少、存储容量大的特点,非常适合用于物联网产品。以下是FlashDB的主要应用场景:
键值数据库:
-
存储产品参数 -
保存用户配置信息 -
管理小型文件
时序数据库:
-
存储动态产生的结构化数据,如温湿度传感器采集的环境监测信息、智能手环实时记录的人体健康信息等。 -
记录运行日志,包括产品历史的运行日志和异常告警记录等。
三、主要特性
-
资源占用极低,内存占用几乎为 0 ; -
支持 多分区,多实例 。数据量大时,可细化分区,降低检索时间; -
支持 磨损平衡 ,延长 Flash 寿命; -
支持 掉电保护 功能,可靠性高; -
支持 字符串及 blob 两种 KV 类型,方便用户操作; -
支持 KV 增量升级 ,产品固件升级后, KVDB 内容也支持自动升级; -
支持 修改每条 TSDB 记录的状态,方便用户进行管理;
四、举例
*使用键值数据库存储UUID:*
#include
#include
#include
#include
#include
#define FDB_LOG_TAG "[main]"
static pthread_mutex_t kv_locker;
static uint32_t init_data = 0;
static struct fdb_kvdb kvdb = { 0 };
static struct fdb_default_kv_node default_kv_table[] =
{
{"init_data", &init_data, sizeof(init_data)},
};
static void lock(fdb_db_t db)
{
pthread_mutex_lock((pthread_mutex_t *)db->user_data);
}
static void unlock(fdb_db_t db)
{
pthread_mutex_unlock((pthread_mutex_t *)db->user_data);
}
int main(void)
{
fdb_err_t result;
bool file_mode = true;
uint32_t sec_size = 4096, db_size = sec_size * 4;
struct fdb_default_kv default_kv;
struct fdb_blob blob;
// 默认 KV 集合
default_kv.kvs = default_kv_table;
default_kv.num = sizeof(default_kv_table) / sizeof(default_kv_table[0]);
// 设置加解锁函数
pthread_mutex_init(&kv_locker, NULL);
fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_LOCK, (void *)lock);
fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_UNLOCK, (void *)unlock);
// 设置扇区
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_SEC_SIZE, &sec_size);
// 设置数据库最大大小
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_MAX_SIZE, &db_size);
// 设置文件模式
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_FILE_MODE, &file_mode);
// 设置数据库文件夹
mkdir("fdb_kvdb1", 0777);
// 初始化KV数据库
result = fdb_kvdb_init(&kvdb, "env", "fdb_kvdb1", &default_kv, &kv_locker);
if (result != FDB_NO_ERR)
{
return -1;
}
// 写入UUID
char uuid_str[64] = "3F2504E0-4F89-11D3-9A0C-0305E82C3301";
fdb_kv_set(&kvdb, "uuid", uuid_str);
FDB_INFO("create the 'uuid' blob KV, value is: %s\n", uuid_str);
// 读取UUID
char *return_value = NULL;
char dst_uuid_str[64] = {0};
return_value = fdb_kv_get(&kvdb, "uuid");
if (return_value != NULL)
{
strncpy(dst_uuid_str, return_value, sizeof(dst_uuid_str));
FDB_INFO("get the 'uuid' value is: %s\n", dst_uuid_str);
}
return 0;
}
fdb_kvdb_init为初始化kv数据库的接口,需要传参:
db | 数据库对象 |
---|---|
name | 数据库名称 |
path | FAL 模式:分区表中的分区名,文件模式:数据库保存的路径 |
default_kv | 默认 KV 集合,第一次初始化时,将会把默认 KV 写入数据库中 |
user_data | 用户自定义数据,没有时传入 NULL |
返回 | 错误码 |
在初始化kv数据库之前,可根据实际需要调用fdb_kvdb_control接口对数据库进行一些控制设置操作。支持的命令控制字如下:
#define FDB_KVDB_CTRL_SET_SEC_SIZE 0x00 /**
#define FDB_KVDB_CTRL_GET_SEC_SIZE 0x01 /**
#define FDB_KVDB_CTRL_SET_LOCK 0x02 /**
#define FDB_KVDB_CTRL_SET_UNLOCK 0x03 /**
#define FDB_KVDB_CTRL_SET_FILE_MODE 0x09 /**
#define FDB_KVDB_CTRL_SET_MAX_SIZE 0x0A /**
#define FDB_KVDB_CTRL_SET_NOT_FORMAT 0x0B /**
这个demo基于Linux系统运行,需要设置成文件模式,存储到文件中进行测试。
初始化 KVDB 前通常需要通过 control
函数设置 加锁回调
与 解锁回调
。对于裸机平台,加锁与解锁回调通常设置为关中断与开中断函数。而 RTOS 平台一般使用 mutex 互斥锁或 二值信号量 的 take 及 release 动作作为加锁与解锁的方式。
更多例子及说明,可以查阅源码及相关文档:
https://github.com/armink/FlashDB
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !