• 正文
  • 推薦器件
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

輕如羽翼,超輕量的嵌入式數(shù)據(jù)庫(kù)!

2024/03/02
2299
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

FlashDB簡(jiǎn)介

FlashDB 是一款超輕量級(jí)的嵌入式數(shù)據(jù)庫(kù),專注于提供嵌入式產(chǎn)品的數(shù)據(jù)存儲(chǔ)方案。與傳統(tǒng)的基于文件系統(tǒng)的數(shù)據(jù)庫(kù)不同,F(xiàn)lashDB 結(jié)合了 Flash 的特性,具有較強(qiáng)的性能及可靠性。并在保證極低的資源占用前提下,盡可能延長(zhǎng) Flash 使用壽命。

FlashDB 提供兩種數(shù)據(jù)庫(kù)模式:

鍵值數(shù)據(jù)庫(kù):是一種非關(guān)系數(shù)據(jù)庫(kù),它將數(shù)據(jù)存儲(chǔ)為鍵值(Key-Value)對(duì)集合,其中鍵作為唯一標(biāo)識(shí)符。KVDB 操作簡(jiǎn)潔,可擴(kuò)展性強(qiáng)。

時(shí)序數(shù)據(jù)庫(kù)時(shí)間序列數(shù)據(jù)庫(kù) (Time Series Database , 簡(jiǎn)稱 TSDB),它將數(shù)據(jù)按照時(shí)間順序存儲(chǔ)。TSDB 數(shù)據(jù)具有時(shí)間戳,數(shù)據(jù)存儲(chǔ)量大,插入及查詢性能高。

https://gitee.com/armink/FlashDB

應(yīng)用場(chǎng)景

如今,物聯(lián)網(wǎng)產(chǎn)品種類越來(lái)越多,運(yùn)行時(shí)產(chǎn)生的數(shù)據(jù)種類及總量及也在不斷變大。FlashDB 提供了多樣化的數(shù)據(jù)存儲(chǔ)方案,不僅資源占用小,并且存儲(chǔ)容量大,非常適合用于物聯(lián)網(wǎng)產(chǎn)品。下面是主要應(yīng)用場(chǎng)景:

鍵值數(shù)據(jù)庫(kù)

  • 產(chǎn)品參數(shù)存儲(chǔ)
  • 用戶配置信息存儲(chǔ)
  • 小文件管理

時(shí)序數(shù)據(jù)庫(kù)

    存儲(chǔ)動(dòng)態(tài)產(chǎn)生的結(jié)構(gòu)化數(shù)據(jù):如 溫濕度傳感器采集的環(huán)境監(jiān)測(cè)信息,智能手環(huán)實(shí)時(shí)記錄的人體健康信息等記錄運(yùn)行日志:存儲(chǔ)產(chǎn)品歷史的運(yùn)行日志,異常告警的記錄等

主要特性

        • 資源占用極低,內(nèi)存占用幾乎為

      0

        ;支持 多分區(qū),多實(shí)例。數(shù)據(jù)量大時(shí),可細(xì)化分區(qū),降低檢索時(shí)間;支持磨損平衡,延長(zhǎng) Flash 壽命;支持掉電保護(hù)功能,可靠性高;支持 字符串及 blob 兩種 KV 類型,方便用戶操作;支持 KV增量升級(jí),產(chǎn)品固件升級(jí)后, KVDB 內(nèi)容也支持自動(dòng)升級(jí);支持 修改每條 TSDB 記錄的狀態(tài),方便用戶進(jìn)行管理;

例子

使用鍵值數(shù)據(jù)庫(kù)存儲(chǔ)UUID

#include?<stdio.h>
#include?<pthread.h>
#include?<sys/stat.h>
#include?<sys/types.h>
#include?<flashdb.h>

#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;

????//?默認(rèn)?KV?集合
????default_kv.kvs?=?default_kv_table;
????default_kv.num?=?sizeof(default_kv_table)?/?sizeof(default_kv_table[0]);

????//?設(shè)置加解鎖函數(shù)
????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);

????//?設(shè)置扇區(qū)
????fdb_kvdb_control(&kvdb,?FDB_KVDB_CTRL_SET_SEC_SIZE,?&sec_size);

????//?設(shè)置數(shù)據(jù)庫(kù)最大大小
????fdb_kvdb_control(&kvdb,?FDB_KVDB_CTRL_SET_MAX_SIZE,?&db_size);
????
????//?設(shè)置文件模式
????fdb_kvdb_control(&kvdb,?FDB_KVDB_CTRL_SET_FILE_MODE,?&file_mode);
????
????//?設(shè)置數(shù)據(jù)庫(kù)文件夾
????mkdir("fdb_kvdb1",?0777);

????//?初始化KV數(shù)據(jù)庫(kù)
????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:?%sn",?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:?%sn",?dst_uuid_str);
????}

????return?0;
}

fdb_kvdb_init為初始化kv數(shù)據(jù)庫(kù)的接口,需要傳參:

db 數(shù)據(jù)庫(kù)對(duì)象
name 數(shù)據(jù)庫(kù)名稱
path FAL 模式:分區(qū)表中的分區(qū)名,文件模式:數(shù)據(jù)庫(kù)保存的路徑
default_kv 默認(rèn) KV 集合,第一次初始化時(shí),將會(huì)把默認(rèn) KV 寫入數(shù)據(jù)庫(kù)中
user_data 用戶自定義數(shù)據(jù),沒(méi)有時(shí)傳入 NULL
返回 錯(cuò)誤碼

在初始化kv數(shù)據(jù)庫(kù)之前,可根據(jù)實(shí)際需要調(diào)用fdb_kvdb_control接口對(duì)數(shù)據(jù)庫(kù)進(jìn)行一些控制設(shè)置操作。支持的命令控制字如下:

#define?FDB_KVDB_CTRL_SET_SEC_SIZE?????0x00?????????????/**<?設(shè)置扇區(qū)大小,需要在數(shù)據(jù)庫(kù)初始化前配置?*/
#define?FDB_KVDB_CTRL_GET_SEC_SIZE?????0x01?????????????/**<?獲取扇區(qū)大小?*/
#define?FDB_KVDB_CTRL_SET_LOCK?????????0x02?????????????/**<?設(shè)置加鎖函數(shù)?*/
#define?FDB_KVDB_CTRL_SET_UNLOCK???????0x03?????????????/**<?設(shè)置解鎖函數(shù)?*/
#define?FDB_KVDB_CTRL_SET_FILE_MODE????0x09?????????????/**<?設(shè)置文件模式,需要在數(shù)據(jù)庫(kù)初始化前配置?*/
#define?FDB_KVDB_CTRL_SET_MAX_SIZE?????0x0A?????????????/**<?在文件模式下,設(shè)置數(shù)據(jù)庫(kù)最大大小,需要在數(shù)據(jù)庫(kù)初始化前配置?*/
#define?FDB_KVDB_CTRL_SET_NOT_FORMAT???0x0B?????????????/**<?設(shè)置初始化時(shí)不進(jìn)行格式化,需要在數(shù)據(jù)庫(kù)初始化前配置?*/

這個(gè)demo基于Linux系統(tǒng)運(yùn)行,需要設(shè)置成文件模式,存儲(chǔ)到文件中進(jìn)行測(cè)試。

初始化 KVDB 前通常需要通過(guò) control 函數(shù)設(shè)置 加鎖回調(diào)解鎖回調(diào) 。對(duì)于裸機(jī)平臺(tái),加鎖與解鎖回調(diào)通常設(shè)置為關(guān)中斷與開中斷函數(shù)。而 RTOS 平臺(tái)一般使用 mutex 互斥鎖或 二值信號(hào)量 的 take 及 release 動(dòng)作作為加鎖與解鎖的方式。

更多例子及說(shuō)明可以查閱源碼及相關(guān)文檔:https://github.com/armink/FlashDB

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
SIT9001AI-83-XXXX-000.FP000X 1 SiTime Corporation LVCMOS Output Clock Oscillator,
暫無(wú)數(shù)據(jù) 查看
AFBR-5803ATZ 1 Broadcom Limited Transceiver, 1270nm Min, 1380nm Max, 125Mbps(Tx), 125Mbps(Rx), ST Connector, Through Hole Mount, ROHS COMPLIANT, SIP-9

ECAD模型

下載ECAD模型
$34.2 查看
SN74LVC1G08QDBVRQ1 1 Texas Instruments Automotive single 2-input, 1.65-V to 5.5-V AND gate 5-SOT-23 -40 to 125

ECAD模型

下載ECAD模型
$0.41 查看

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

本公眾號(hào)專注于嵌入式技術(shù),包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學(xué)習(xí)筆記,同時(shí),公眾號(hào)內(nèi)包含大量的學(xué)習(xí)資源。歡迎關(guān)注,一同交流學(xué)習(xí),共同進(jìn)步!