合宙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…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
