您现在的位置是:首页 > 行业发展
超轻量的嵌入式数据库!
智慧创新站
2025-06-03【行业发展】238人已围观
简介FlashDB简介FlashDB是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB结合了Flash的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长Flash使用寿命。FlashDB提供两种数据库模式:键值数据库:...
FlashDB是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB结合了Flash的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长Flash使用寿命。
FlashDB提供两种数据库模式:
键值数据库:是一种非关系数据库,它将数据存储为键值(Key-Value)对集合,其中键作为唯一标识符。KVDB操作简洁,可扩展性强。
时序数据库:时间序列数据库(TimeSeriesDatabase,简称TSDB),它将数据按照时间顺序存储。TSDB数据具有时间戳,数据存储量大,插入及查询性能高。
应用场景如今,物联网产品种类越来越多,运行时产生的数据种类及总量及也在不断变大。FlashDB提供了多样化的数据存储方案,不仅资源占用小,并且存储容量大,非常适合用于物联网产品。下面是主要应用场景:
键值数据库:
产品参数存储
用户配置信息存储
小文件管理
时序数据库:
存储动态产生的结构化数据:如温湿度传感器采集的环境监测信息,智能手环实时记录的人体健康信息等
记录运行日志:存储产品历史的运行日志,异常告警的记录等
主要特性资源占用极低,内存占用几乎为0;
支持多分区,多实例。数据量大时,可细化分区,降低检索时间;
支持磨损平衡,延长Flash寿命;
支持掉电保护功能,可靠性高;
支持字符串及blob两种KV类型,方便用户操作;
支持KV增量升级,产品固件升级后,KVDB内容也支持自动升级;
支持修改每条TSDB记录的状态,方便用户进行管理;
例子使用键值数据库存储UUID/_LOG_TAG"[main]"staticpthread_mutex_tkv_locker;staticuint32_tinit_data=0;staticstructfdb_kvdbkvdb={0};staticstructfdb_default_kv_nodedefault_kv_table[]={{"init_data",init_data,sizeof(init_data)},};staticvoidlock(fdb_db_tdb){pthread_mutex_lock((pthread_mutex_t*)db-user_data);}staticvoidunlock(fdb_db_tdb){pthread_mutex_unlock((pthread_mutex_t*)db-user_data);}intmain(void){fdb_err_tresult;boolfile_mode=true;uint32_tsec_size=4096,db_size=sec_size*4;structfdb_default_kvdefault_kv;structfdb_blobblob;//默认KV集合default_=default_kv_table;default_=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;}//写入UUIDcharuuid_str[64]="3F2504E0-4F89-11D3-9A0C-0305E82C3301";fdb_kv_set(kvdb,"uuid",uuid_str);FDB_INFO("createthe'uuid'blobKV,valueis:%s\n",uuid_str);//读取UUIDchar*return_value=NULL;chardst_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("getthe'uuid'valueis:%s\n",dst_uuid_str);}return0;}fdb_kvdb_init为初始化kv数据库的接口,需要传参:
db数据库对象name数据库名称pathFAL模式:分区表中的分区名,文件模式:数据库保存的路径default_kv默认KV集合,第一次初始化时,将会把默认KV写入数据库中user_data用户自定义数据,没有时传入NULL返回错误码
在初始化kv数据库之前,可根据实际需要调用fdb_kvdb_control接口对数据库进行一些控制设置操作。支持的命令控制字如下:
defineFDB_KVDB_CTRL_GET_SEC_SIZE0x01/**获取扇区大小*/defineFDB_KVDB_CTRL_SET_UNLOCK0x03/**设置解锁函数*/defineFDB_KVDB_CTRL_SET_MAX_SIZE0x0A/**在文件模式下,设置数据库最大大小,需要在数据库初始化前配置*/#defineFDB_KVDB_CTRL_SET_NOT_FORMAT0x0B/**设置初始化时不进行格式化,需要在数据库初始化前配置*/
这个demo基于Linux系统运行,需要设置成文件模式,存储到文件中进行测试。
初始化KVDB前通常需要通过control函数设置加锁回调与解锁回调。对于裸机平台,加锁与解锁回调通常设置为关中断与开中断函数。而RTOS平台一般使用mutex互斥锁或二值信号量的take及release动作作为加锁与解锁的方式。
更多例子及说明可以查阅源码及相关文档:
如果文章对你有帮助,麻烦帮忙点赞、收藏、转发,谢谢!
私信回复【嵌入式书籍】,可获取博主精心整理的嵌入式电子书一份
很赞哦!(133)