基础资料
基于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:
-- 检查一下当前固件是否支持fdb
if not fdb then
while true do
log.info("fdb", "this demo need fdb")
sys.wait(1000)
end
end
如提示:"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 then
while 1 do
local k = fdb.kv_next(iter)
if not k then
break
end
log.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 then
while 1 do
local k = fdb.kv_next(iter)
if not k then
break
end
log.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)