合宙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…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
