用於Electron/Nodejs的數據持久緩存庫
Lndb
lndb是基於本地文件系統封裝的一套靈活的持久化存儲資料庫,支持Node、Electron等。
Github: https://github.com/yansenlei/lndb
使用文件系統作為基礎存儲方式,並在上層讀寫時提供靈活的插件機制,這意味著你可以根據自己的需求定製讀寫功能,詳細信息查看插件機制。
安裝
$ npm install lndb
使用
const LNDB = require(lndb)
const db = new LNDB(your/path)
// 初始類型
const pg = db.init(page)
// 寫入數據
pg.set(key, {hello: lndb!})
// 讀取類型信息
pg.get(key)
// 刪除指定key的緩存
pg.remove(key)
// 清空類型下所有緩存
pg.clear()
讀寫信息說明
- 默認情況下不論存入何種數據類型,通過
.get(key)
獲取到的都是一個文件結構,這是為了可以自由的獲取文件信息。 如上面舉例那樣的Object
類型數據默認存入data.json
中:
__lndb__/page/
└── key
└── data.json
你通過.get(key)
獲取到的數據像這樣:
{
"data.json": {
"path": "pro/__lndb__/page/key/data.json"
},
"data": {
"hello": "lndb!"
}
}
如果使用內置插件內的unzip
這樣的插件來存入文件,文件樹像這樣:
__lndb__/page/
└── key
└── files
├── index.html
└── about.html
你通過.get(key)
獲取到的數據像這樣:
{
"files": {
"path": "pro/__lndb__/page/key/files/",
"child": {
"index.html": {
"path": "pro/__lndb__/page/key/files/index.html"
},
"about.html": {
"path": "pro/__lndb__/page/key/files/about.html"
}
}
}
}
- 如果存入數據是如上面舉例那樣的
Object
類型,在讀取時會默認載入數據信息可以通過get(key).data
獲取,如果需要更靈活的操作數據信息可以使用lodash
插件。 - 由於使用的是文件命名,所以命名上對符號(
/
) 是很敏感的,雖然程序會默認使用__lndb__
來替換敏感符號後再命名文件,但是希望你在使用的時候注意規避敏感符號以保證程序正常運行。
插件機制
也許默認的讀寫操作並不能滿足你的需求,值得一提的是,Lndb 的核心是可以靈活的擴展讀寫功能,你可以引入符合標準的插件來替換現有的讀寫功能:
const demoPlugin = require(demo-plugin)
// add plugin
db.use(demo-plugin, demoPlugin, { "options": true})
const pg = db.init(page)
pg.set(key, { hello: lndb!}, {
name: demo-plugin,
options: {}
})
- .use(name, plugin, options)
name
唯一名稱plugin
插件對象options
插件參數
- .set/.get(k, v, {name, options})
name
唯一名稱options
插件參數,替換db.use()
時的預製參數
插件規範
現在你可以根據自己的需求編寫自己的讀取方式,但是你必須遵循必要的規範,插件模板看起來像這樣:
module.exports = {
install(Ln, params = {}, options = {}){
// 你的自定義操作
// 調用文件獲取
Ln.fls.get(id)
// 調用文件寫入
Ln.fls.set(params.id, params.value)
// 獲取當前數據保存路徑
Ln.fls.datapath
return true
}
}
目前插件允許你在set()
,get()
上做自定義操作。 插件內是一個對象,對象內函數名為install
,函數帶有三個參數:
- install(Ln, params, options)
Ln
當前讀寫上下文params
讀寫時的參數{id, value}
options
傳入插件的配置信息
內置插件
內置插件默認已經存在於系統插件列表中,可以在.get()
.set()
直接使用
lodash
讀取擴展,使用lodash插件靈活讀寫,該插件參考了lowdb
的使用方式,這可以很靈活的處理單個文件,具體參考lodash文檔
const pg = db.init(page)
const _ = pg.get(key, [lodash])
_.setState({hello: lndb!}).write()
_.getState() // { hello: lndb!}
_.has("hello").value() // true
_.update("hello", n => n.toUpperCase()).write() // update -> { hello: LNDB!!}
lodash plugin API
- _.setState()
- 寫入數據到實例中
- _.getState()
- 獲取當前實例的數據
- _.update()
- 更新數據
- _.read()
- 讀取磁碟中的數據到實例,返回實例
- _.write()
- 所有寫入操作需要調用
.write()
後才寫入磁碟
unzip
寫入擴展,使用unzip寫入zip文件時解壓到指定目錄下,意味著可以通過.get()
方法獲取到解壓後的路徑,便可使用裡面的文件
pg.set(key, value, {
name: unzip
})
pg.get(key)
value
<Buffer> | <Base64>
License
目前還有需要優化的地方,歡迎大佬指正。 如果你有任何意見或者想貢獻本項目,歡迎提交Issues或PR。
MIT - yansenlei
推薦閱讀: