用於Electron/Nodejs的資料持久快取庫

Leiys發表於2018-12-17

Lndb

lndb是基於本地檔案系統封裝的一套靈活的持久化儲存資料庫,支援Node、Electron等。

Github: github.com/yansenlei/l…

使用檔案系統作為基礎儲存方式,並在上層讀寫時提供靈活的外掛機制,這意味著你可以根據自己的需求定製讀寫功能,詳細資訊檢視外掛機制

安裝

$ 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()時的預製引數

外掛規範

現在你可以根據自己的需求編寫自己的讀取方式,但是你必須遵循必要的規範,外掛模板看起來像這樣:

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

相關文章