用於Electron/Nodejs的數據持久緩存庫

Lndb

lndb是基於本地文件系統封裝的一套靈活的持久化存儲數據庫,支持Node、Electron等。html

Github: github.com/yansenlei/l…git

使用文件系統做爲基礎存儲方式,並在上層讀寫時提供靈活的插件機制,這意味着你能夠根據本身的需求定製讀寫功能,詳細信息查看插件機制github

安裝

$ 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()
複製代碼

讀寫信息說明

  1. 默認狀況下不論存入何種數據類型,經過.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"
          }
        }
      }
    }
    複製代碼
  2. 若是存入數據是如上面舉例那樣的Object類型,在讀取時會默認加載數據信息能夠經過get(key).data獲取,若是須要更靈活的操做數據信息可使用lodash插件。
  3. 因爲使用的是文件命名,因此命名上對符號(\ /) 是很敏感的,雖然程序會默認使用__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()時的預製參數

插件規範

如今你能夠根據本身的需求編寫本身的讀取方式,可是你必須遵循必要的規範,插件模板看起來像這樣:npm

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,函數帶有三個參數:json

  • install(Ln, params, options)
    • Ln 當前讀寫上下文
    • params 讀寫時的參數 {id, value}
    • options 傳入插件的配置信息

內置插件

內置插件默認已經存在於系統插件列表中,能夠在.get() .set()直接使用緩存

lodash

讀取擴展,使用lodash插件靈活讀寫,該插件參考了lowdb的使用方式,這能夠很靈活的處理單個文件,具體參考lodash文檔bash

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

相關文章
相關標籤/搜索