硬汉嵌入式论坛

 找回密码
 立即注册
查看: 322|回复: 12
收起左侧

[其它] [求助]有没有真正好用的键值对数据库?

[复制链接]

27

主题

269

回帖

350

积分

高级会员

积分
350
QQ
发表于 3 天前 | 显示全部楼层 |阅读模式
在arduino 环境开发 esp32 时有用到 Preferences ,使用时就是一个全局对象,然后就可以无感 get、set。

不知道 h7 上有哪种推荐的键值对数据库,可以用在内部 flash外部 spi flash 上实现如此简洁的使用体验呢?

有些受够了旧工程结构体整体存储整体加载的体验,维护整个结构体的对齐和初始化、各种旧参量的遗留无法解决兼容问题,好麻烦,想找个键值对做替换。
过去检索一些“嵌入式数据库”但是都看起来没有那么简单,相互之间也难分高下,求助下群友有没有自己这方面在用的推荐



/* 数据库存储对象 */
#include <Preferences.h>
Preferences prefs;

void McuInit(void)
{
    prefs.begin("sys");

    // 读取波特率
    int    uartBaud  = prefs.getInt("uartbaud", 9600);
    int    canBaud   = prefs.getInt("canbtaud", 250000);
    String interface = prefs.getString("interface", "232");
}






回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
发表于 3 天前 | 显示全部楼层
之前网上收藏了一个,还没有去研究,你看看他这个实现怎么样

https://github.com/cnlohr/cnrbtree
回复

使用道具 举报

4

主题

443

回帖

455

积分

高级会员

积分
455
发表于 3 天前 | 显示全部楼层
少量数据推荐用FlashDB。分区别太大,否则开机初始化时间长。不支持H7内部flash,H7最小粒度256bit。FlashDB目前最大支持128bit
回复

使用道具 举报

27

主题

269

回帖

350

积分

高级会员

积分
350
QQ
 楼主| 发表于 3 天前 | 显示全部楼层
eric2013 发表于 2026-1-6 15:42
之前网上收藏了一个,还没有去研究,你看看他这个实现怎么样

https://github.com/cnlohr/cnrbtree

这个库属于底层索引算法,需要包装内存管理、持久化、校验才能当作嵌入式数据库。

看起来的话改造成嵌入式数据库有些复杂,主要是他滥用 calloc 和 free,需要实现一套完整紧密的私有内存管理。或许借助 threadx 的内存池可以实现?不过树的恢复也得测试。

难点在于 CNRBTREE_MALLOC/CNRBTREE_FREE 的实现,还有何时持久化,搞完这一套那不如不要基于他的算法。

我一直没想到如何解决 flash 按扇区擦除的耗时这块,在 spi flash 中耗时尤其明显,哪怕有 DMA 也是非常扰乱系统。也没有细看其他数据库是如何处理的,如果他们就是很暴力的每次都持久化,那可能还是用不了。
回复

使用道具 举报

27

主题

269

回帖

350

积分

高级会员

积分
350
QQ
 楼主| 发表于 3 天前 | 显示全部楼层
cctv180 发表于 2026-1-6 16:01
少量数据推荐用FlashDB。分区别太大,否则开机初始化时间长。不支持H7内部flash,H7最小粒度256bit。FlashD ...

有实际工程使用过不?体验怎么样?

说实话有点抗拒 armink 这家伙搞的东西,老是搞的又丑又大又耦合。
回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
发表于 3 天前 | 显示全部楼层
yono 发表于 2026-1-6 16:18
有实际工程使用过不?体验怎么样?

说实话有点抗拒 armink 这家伙搞的东西,老是搞的又丑又大又耦合。

我用着还行。配合fal使 还挺无感的,不同工程都不用怎么改,存储部分目前有40来个项目共用公共程序的。不过我这边的项目对于ram flash 的占用都不敏感。
回复

使用道具 举报

27

主题

269

回帖

350

积分

高级会员

积分
350
QQ
 楼主| 发表于 3 天前 | 显示全部楼层
1824789902 发表于 2026-1-6 16:54
我用着还行。配合fal使 还挺无感的,不同工程都不用怎么改,存储部分目前有40来个项目共用公共程序的。不 ...

我看 FlashDB 有这样的特性。

优势
1.活跃扇区的轮转进行磨损均衡,这将减少擦除的操作
2.接口简单,按照我编好的 spi-flash 驱动 api,应该可以很简单的移植

缺点
1.必须依赖 fal 或者文件系统,这二者很遗憾我的现有工程都没有,所以需要额外的引入
2.我认为最大的劣势:在内存中上没有一个实际缓存的维护,所以每次 读/写 都会必须引起 spi-flash 线路的动作(当然使用内部flash会快很多),适合少量动作的配置量使用,不适合状态量这样需要频繁读取的变量。这不是他作为嵌入式数据库的劣势,是我的工程中使用状态量实现了很多switch多态但又不是模块化的多态,这是和工程不契合的地方。

总的来说这确实是一个很好的嵌入式数据库,打算试试看,然后把工程改一改。

如果可选”是否维护内存缓存“就完美了。
回复

使用道具 举报

27

主题

269

回帖

350

积分

高级会员

积分
350
QQ
 楼主| 发表于 3 天前 | 显示全部楼层
看他也有索引 cache 这种东西,应该是有考虑”内存缓存“的,只是做成常驻功能就不轻量化、做成可裁剪功能有些复杂,就没实现
回复

使用道具 举报

38

主题

231

回帖

345

积分

高级会员

积分
345
发表于 前天 09:13 | 显示全部楼层
eeprom不好用吗
封装成一个结构体,不要内存对齐
回复

使用道具 举报

5

主题

29

回帖

44

积分

新手上路

积分
44
发表于 前天 09:22 | 显示全部楼层
1824789902 发表于 2026-1-6 16:54
我用着还行。配合fal使 还挺无感的,不同工程都不用怎么改,存储部分目前有40来个项目共用公共程序的。不 ...

同感,但是位置不一样,他的东西一直是为rt-thread 服务的
回复

使用道具 举报

27

主题

269

回帖

350

积分

高级会员

积分
350
QQ
 楼主| 发表于 前天 13:34 | 显示全部楼层
LinY 发表于 2026-1-7 09:13
eeprom不好用吗
封装成一个结构体,不要内存对齐

EEPROM 用结构体和 spi-flash 有同一个痛点。

结构体里需要预留一些空位以便后续增加存储,或者旧配置项的位置需要永久预留,哪怕这个配置项在新版程序中被移除(避免从老版本升级后读取数据不正确)。

这种方法在维护老版本的兼容性时很让人头疼,比如一个一年前出货的老机器,和新版本程序的存储排布就很可能不同,升级后crc不通过引发初始化,客户的一些原有配置项就会丢。

键值对不会,反正以键为索引,没索引到有新程序的default回退,根本不用管老版本,直接硬升级就好了。
回复

使用道具 举报

6

主题

55

回帖

73

积分

初级会员

积分
73
发表于 前天 14:47 | 显示全部楼层
同样的问题,现在使用flashdb来处理参数的保存,效果不错。
回复

使用道具 举报

0

主题

21

回帖

21

积分

新手上路

积分
21
发表于 前天 15:44 | 显示全部楼层
yono 发表于 2026-1-6 18:10
我看 FlashDB 有这样的特性。

优势

对 活跃扇区的轮转进行磨损均衡 感兴趣,有没有相关的资料介绍我学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-1-9 16:40 , Processed in 0.056008 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表