合宙Air103|fbd数据库| fskv - 替代fdb库|LuatOS-SOC接口|官方demo|学习(16):类redis的fbd数据库及fskv库
基础资料
基于Air103开发板:🚗 Air103 - LuatOS 文档
上手:开发上手 - LuatOS 文档
探讨重点
对官方社区库接口类redis的fbd数据库及fskv库的调用及示例进行复现及分析,了解两库的基本原理及操作方法。
软件及工具版本
LuatOS@AIR103 base 22.12 bsp V0016 32bit
硬件准备
Air103开发板1块。
简介
fbd库基于FlashDB,提供在flash上保存数据的能力,数据储存方式类似于redis的k-v
demo例程首先判断当前固件是否支持fdb:
-- 检查一下当前固件是否支持fdbif not fdb thenwhile true dolog.info("fdb", "this demo need fdb")sys.wait(1000)endend
如提示:"this demo need fdb"
则需要取消fdb的注释重新编译:
编译方法可参考:
https://blog.csdn.net/Medlar_CN/article/details/128456712
LOG:
[2023-02-12 22:05:20.873] I/main auth ok 85104250303938373506004A521456060078 AIR103
[2023-02-12 22:05:20.873] I/main LuatOS@AIR103 base 22.12 bsp V0016 32bit
[2023-02-12 22:05:20.873] I/main ROM Build: Feb 12 2023 22:01:50
[2023-02-12 22:05:20.873] D/main loadlibs luavm 180208 11584 12264
[2023-02-12 22:05:20.873] D/main loadlibs sys 12288 4720 4720
[2023-02-12 22:05:21.904] D/lfs init ok
[2023-02-12 22:05:21.904] I/user.fdb init complete
[2023-02-12 22:05:22.296] I/user.fdb boottime number 2
[2023-02-12 22:05:22.296] I/user.fdb my_bool boolean true
[2023-02-12 22:05:22.300] I/user.fdb my_int number 123
[2023-02-12 22:05:22.300] I/user.fdb my_number number 1.230000
[2023-02-12 22:05:22.300] I/user.fdb my_str string luatos
[2023-02-12 22:05:22.302] I/user.fdb my_table table {"name":"wendal","age":18}
[2023-02-12 22:05:22.328] I/user.fdb my_str_int string 123
[2023-02-12 22:05:22.328] I/user.fdb 1 byte key string "123"
[2023-02-12 22:05:22.375] I/user.fdb my_bool nil nil
[2023-02-12 22:05:22.375] I/user.fdb 1 value 123
[2023-02-12 22:05:22.378] I/user.fdb boottime value 2
[2023-02-12 22:05:22.378] I/user.fdb my_int value 123
[2023-02-12 22:05:22.378] I/user.fdb my_number value 1.230000
[2023-02-12 22:05:22.405] I/user.fdb my_str_int value 123
[2023-02-12 22:05:22.405] I/user.fdb my_str value luatos
[2023-02-12 22:05:22.408] I/user.fdb my_table value table: 2000A230
[2023-02-12 22:05:22.408] I/user.fdb iter exit
[2023-02-12 22:05:23.999] I/user.fdb 1.579000
fdb - kv数据库,掉电不丢数据
已适配 Air101/Air103 Air105 ESP32C3 Air780
备注
本页文档由这个文件自动生成。如有错误,请提交issue或帮忙修改后pr,谢谢!
小技巧
本库有专属demo,点此链接查看fdb的demo例子
fdb.kvdb_init(name, partition)
初始化kv数据库
参数
传入值类型 | 解释 |
string | 数据库名,当前仅支持env |
string | FAL分区名,当前仅支持onchip_fdb |
返回值
返回值类型 | 解释 |
boolean | 成功返回true,否则返回false |
例子
-- fdb库基于 flashdb , 再次表示感谢.
if fdb.kvdb_init("env", "onchip_fdb") then
log.info("fdb", "kv数据库初始化成功")
end
-- 关于清空fdb库
-- 下载工具是没有提供直接清除fdb数据的途径的, 但有有办法解决
-- 写一个main.lua, 执行 fdb.kvdb_init 后 执行 fdb.clear() 即可全清fdb数据.
fdb.kv_set(key, value)
设置一对kv数据
参数
传入值类型 | 解释 |
string | key的名称,必填,不能空字符串 |
string | 用户数据,必填,不能nil, 支持字符串/数值/table/布尔值, 数据长度最大255字节 |
返回值
返回值类型 | 解释 |
boolean | 成功返回true,否则返回false |
number | 第二个为返回为flashdb的fdb_kv_set_blob返回详细状态,0:无错误 1:擦除错误 2:读错误 3:些错误 4:未找到 5:kv名字错误 6:kv名字存在 7:已保存 8:初始化错误 |
例子
if fdb.kvdb_init("env", "onchip_fdb") then
log.info("fdb", fdb.kv_set("wendal", "goodgoodstudy"))
end
fdb.kv_get(key, skey)
根据key获取对应的数据
参数
传入值类型 | 解释 |
string | key的名称,必填,不能空字符串 |
string | 可选的次级key,仅当原始值为table时有效,相当于 fdb.kv_get(key)[skey] |
返回值
返回值类型 | 解释 |
any | 存在则返回数据,否则返回nil |
例子
if fdb.kvdb_init("env", "onchip_fdb") then
log.info("fdb", fdb.kv_get("wendal"))
end
fdb.kv_del(key)
根据key删除数据
参数
传入值类型 | 解释 |
string | key的名称,必填,不能空字符串 |
返回值
返回值类型 | 解释 |
bool | 成功返回true,否则返回false |
例子
if fdb.kvdb_init("env", "onchip_fdb") then
log.info("fdb", fdb.kv_del("wendal"))
end
fdb.kv_clr()
清空整个kv数据库
参数
无
返回值
返回值类型 | 解释 |
bool | 成功返回true,否则返回false |
例子
-- 清空
fdb.kv_clr()
fdb.kv_iter()
kv数据库迭代器
参数
无
返回值
返回值类型 | 解释 |
userdata | 成功返回迭代器指针,否则返回nil |
例子
-- 清空
local iter = fdb.kv_iter()
if iter thenwhile 1 dolocal k = fdb.kv_next(iter)if not k thenbreakendlog.info("fdb", k, "value", fdb.kv_get(k))end
end
fdb.kv_iter(iter)
kv迭代器获取下一个key
参数
传入值类型 | 解释 |
userdata | fdb.kv_iter()返回的指针 |
返回值
返回值类型 | 解释 |
string | 成功返回字符串key值, 否则返回nil |
例子
-- 清空
local iter = fdb.kv_iter()
if iter thenwhile 1 dolocal k = fdb.kv_next(iter)if not k thenbreakendlog.info("fdb", k, "value", fdb.kv_get(k))end
end
fdb.kv_stat()
获取kv数据库状态
参数
无
返回值
返回值类型 | 解释 |
int | 已使用的空间,单位字节 |
int | 总可用空间, 单位字节 |
int | 总kv键值对数量, 单位个 |
例子
-- 本API于2022.07.23 添加
local used,maxs,kv_count = fdb.kv_stat()
log.info("fdb", "kv", used,maxs,kv_count)
fskv - 替代fdb库
已适配 Air101/Air103 Air105 ESP32C3 Air780
备注
本页文档由这个文件自动生成。如有错误,请提交issue或帮忙修改后pr,谢谢!
小技巧
本库有专属demo,点此链接查看fskv的demo例子
示例
-- 本库的目标是替代fdb库
-- 1. 兼容fdb的函数
-- 2. 使用fdb的flash空间,启用时也会替代fdb库
fskv.init()
fskv.set("wendal", 1234)
log.info("fskv", "wendal", fskv.get("wendal"))--[[
fskv与fdb的实现机制导致的差异fskv fdb
1. value长度 4096 255
2. key长度 63 64
3. 空间利用率(对比) 较低 较高
4. 读取速度 恒定 脏数据影响速度,非恒定
5. 写入数据 恒定 脏数据影响速度,非恒定
]]
fskv.init()
初始化kv数据库
参数
无
返回值
返回值类型 | 解释 |
boolean | 成功返回true,否则返回false |
例子
if fskv.init() then
log.info("fdb", "kv数据库初始化成功")
end
-- 关于清空fdb库
-- 下载工具是没有提供直接清除fdb数据的途径的, 但有有办法解决
-- 写一个main.lua, 执行 fskv.kvdb_init 后 执行 fskv.clear() 即可全清fdb数据.
fskv.set(key, value)
设置一对kv数据
参数
传入值类型 | 解释 |
string | key的名称,必填,不能空字符串 |
string | 用户数据,必填,不能nil, 支持字符串/数值/table/布尔值, 数据长度最大4095字节 |
返回值
返回值类型 | 解释 |
boolean | 成功返回true,否则返回false |
例子
-- 设置数据, 字符串,数值,table,布尔值,均可
-- 但不可以是nil, function, userdata, task
log.info("fdb", fskv.set("wendal", "goodgoodstudy"))
log.info("fdb", fskv.set("upgrade", true))
log.info("fdb", fskv.set("timer", 1))
log.info("fdb", fskv.set("bigd", {name="wendal",age=123}))
fskv.get(key, skey)
根据key获取对应的数据
参数
传入值类型 | 解释 |
string | key的名称,必填,不能空字符串 |
string | 可选的次级key,仅当原始值为table时有效,相当于 fskv.get(key)[skey] |
返回值
返回值类型 | 解释 |
any | 存在则返回数据,否则返回nil |
例子
if fskv.init() then
log.info("fdb", fskv.get("wendal"))
end
fskv.del(key)
根据key删除数据
参数
传入值类型 | 解释 |
string | key的名称,必填,不能空字符串 |
返回值
返回值类型 | 解释 |
bool | 成功返回true,否则返回false |
例子
log.info("fdb", fskv.del("wendal"))
fskv.clear()
清空整个kv数据库
参数
无
返回值
返回值类型 | 解释 |
bool | 成功返回true,否则返回false |
例子
-- 清空
fskv.clear()
fskv.iter()
kv数据库迭代器
参数
无
返回值
返回值类型 | 解释 |
userdata | 成功返回迭代器指针,否则返回nil |
例子
-- 清空
local iter = fskv.iter()
if iter then
while 1 do
local k = fskv.next(iter)
if not k then
break
end
log.info("fdb", k, "value", fskv.kv_get(k))
end
end
fskv.iter(iter)
kv迭代器获取下一个key
参数
传入值类型 | 解释 |
userdata | fskv.iter()返回的指针 |
返回值
返回值类型 | 解释 |
string | 成功返回字符串key值, 否则返回nil |
例子
-- 清空
local iter = fskv.iter()
if iter then
while 1 do
local k = fskv.next(iter)
if not k then
break
end
log.info("fskv", k, "value", fskv.get(k))
end
end
fskv.status()
获取kv数据库状态
参数
无
返回值
返回值类型 | 解释 |
int | 已使用的空间,单位字节 |
int | 总可用空间, 单位字节 |
int | 总kv键值对数量, 单位个 |
例子
local used, total,kv_count = fskv.status()
log.info("fdb", "kv", used,total,kv_count)
相关文章:

合宙Air103|fbd数据库| fskv - 替代fdb库|LuatOS-SOC接口|官方demo|学习(16):类redis的fbd数据库及fskv库
基础资料 基于Air103开发板:🚗 Air103 - LuatOS 文档 上手:开发上手 - LuatOS 文档 探讨重点 对官方社区库接口类redis的fbd数据库及fskv库的调用及示例进行复现及分析,了解两库的基本原理及操作方法。 软件及工具版本 Luat…...

【论文精读】Deep Residual Learning for Image Recognition
1 Degradation Problem💦 深度卷积神经网络在图像分类方面取得了一系列突破。深度网络自然地将低/中/高级特征和分类器以端到端的多层方式集成在一起,特征的“层次”可以通过堆叠层数(深度)来丰富。最近的研究揭示了网络深度是至关重要的,在具…...
Lesson2:基础语法、输出输入
一、基础语法 1、行结构 一个Python程序可分为许多逻辑行,一般来说:一个语句就是一行代码,不会跨越多行。 """比如下面的Python程序,一共有3个逻辑行,每一行都通过print()输出一个结果。""…...
android 9.0去掉前置摄像头闪光灯功能
1.1概述 在9.0的系统rom定制化开发中,在系统中camera2也是非常重要的一部分功能,在很多场合会用到camera2拍照视频,等等功能, 但是在使用过程中发现系统camera2在使用的时候,在前置摄像头进行拍照的时候,会出现闪光灯的情况,对于产品来说,者就是一个大问题,所以产品要求…...

静态分析工具Cppcheck在Windows上的使用
之前在https://blog.csdn.net/fengbingchun/article/details/8887843 介绍过Cppcheck,那时还是1.x版本,现在已到2.x版本,这里再总结下。 Cppcheck是一个用于C/C代码的静态分析工具,源码地址为https://github.com/danmar/cppcheck …...
用一年时间脱胎换骨
生活习惯篇早睡早起11点30之前必须睡觉按时吃饭特别是早餐控糖,少吃甜食早起刷牙后,喝一杯温水保持身材,养成运动健身的习惯养成持续写作的习惯记录选题,金句,素材断舍离,定期整理,把不用的东西…...

全景拼接python旗舰版
前言在这个项目中,您将构建一个管道,将几幅图像拼接成一个全景图。您还将捕获一组您自己的图像来报告最终的结果。步骤1 特征检测与描述本项目的第一步是对序列中的每幅图像分别进行特征检测。回想一下我们在这个类中介绍过的一些特征探测器:…...
(C语言)常见的字符串与内存操作函数
问:1. Solve the problems:我想用三种方法求字符串的长度怎么办?2. strlen处理的字符串中有什么时需要注意:什么只记为什么?当什么不起什么作用时,什么不计算在内,编译器会把什么,什…...
Linux基础笔记总结
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...

R语言学习笔记
1.R语言介绍 2.R语言安装 官网:https://www.r-project.org/ CARN → 选择China中任意镜像站点 → Download R for Windows → base(二进制版本R基础软件)→ Download R-4.2.2 for Windows (76 megabytes, 64 bit) 3.Rstudio安装 https://po…...

【软件测试】企业测试面试题9道,从自我介绍到项目考察+回答......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 1、自我介绍 您好&a…...

《Spring源码深度分析》第8章 数据库连接JDBC
目录标题前言一、数据库连接方式1.JDBC连接数据库2.Spring Jdbc连接数据库(JdbcTemplate)二、JdbcTemplate源码分析1.update/save功能的实现源码分析入口(关键)基础方法execute1.获取数据库连接池2.应用用户设定的输入参数3. 调用回调函数处理4. 资源释放Update中的回调函数2.q…...
ModuleNotFoundError的解决方案【已解决】
问题描述 有包却提示ModuleNotFoundError 在正常情况下,你使用pip或者conda检查是否有相应包的时候,显示的是有的。但是一旦运行程序就会报这个ModuleNotFoundError错误。 问题可能是程序运行环境不对。 解决方案 (1)进入正确…...

Vue驼峰与短横线分割命名中有哪些坑
目录 0.前言 驼峰和短横线分割命名注意事项 组件注册命名 父子组件数据传递时命名 父子组件函数传递 0.前言 Vue驼峰命名法指的是将变量以驼峰形式命名,例如 userName、userId 等,而短横线分隔符法则指的是用短横线分隔变量名,例如 user…...
从文件中加载数据以及异常处理
上期学习了数据的存储,这次学习数据的加载 你可以使用把openpyxl.load_workbook() 来打开一个已经存在的工作簿 >>> from openpyxl import load_workbook >>> wb load_workbook(filename empty_book.xlsx) >>> sheet_ranges wb[ran…...

【JavaSE】方法的使用
方法的使用BIT-5-方法的使用绪论1. 方法概念及使用1.1什么是方法1.2 方法定义1.3 实参和形参的关系(重要)1.4 没有返回值的方法2. 方法重载2.1 为什么需要方法重载2.2 方法重载概念3. 递归3.1 生活中的故事3.2 递归的概念3.2 递归执行过程分析3.3 递归练…...

ModelScope 垂类检测系列模型介绍
文章目录ModelScope介绍垂类模型介绍调用方式1 Demo Service2 Notebook3 本地使用* 二次开发总结ModelScope介绍 ModelScope 是阿里达摩院推出的 中文版模型即服务(MaaS, Model as a Service)共享平台。该平台在2022年的云栖大会上发布,之前…...

Linux | Linux卸载和安装MySQL(Ubuntu版)
最近又来到了Linux学习了,原因是要接触云服务器相关知识, 所以博主整理了一些关于Linux的知识, 欢迎各位朋友点赞收藏,天天开心丫,快乐写代码! Linux系列文章请戳 Linux教程专栏 目录 一、卸载MySQL 1…...

【C1】数据类型,常量变量,输入输出,运算符,if/switch/循环,/数组,指针,/结构体,文件操作,/编译预处理,gdb,makefile,线程
文章目录1.数据类型:单双引号,char(1B),int/float(32位系统,大小一样4B,但存储方式不同),double(8B),long double…...
【深度学习】pytorch的基础操作
import torch import numpy as np # 1.1 根据已有的数据创建张量 def test01(): # 1.1 创建标量 data torch.tensor(10) print(data) # 1.2 使用numpy数组来创建张量 data np.random.randn(2,3) data torch.tensor(data) print(data) # 1.3使用list…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...