開發一個大型Electron的應用,或許需要在用戶端存儲大量的資料,比如聊天應用或郵件用戶端
可選的用戶端資料庫方案看似很多,但一一對比下來,最優解隻有一個
接下來我們就一起來經曆一下這個技術選型的過程:
以這種方式存儲一些使用者的配置資訊是完全沒問題的(使用者名、家庭住址、是否開啟免打擾模式等)
但要用這種方式存儲大量解構化的資料,就非常不科學了
主要原因是:
用這種方案操作資料是需要把檔案中的所有資料都加載到用戶端電腦的記憶體中去的
由于沒有索引機制,關聯查詢、條件查詢等操作效率不高,
更新了某項資料之後,要持久化更新操作,又要重寫整個檔案。
PS:
如果你的應用操作的資料量不多,
你可以選擇類似lowdb(https://github.com/typicode/lowdb)這樣的工具,
在一定程度上環節這些困難
Cookies存儲容量太小,隻能存4kb的内容,而且每次與服務端互動,同域下的Cookie還會被攜帶到服務端,也沒有關聯查詢、條件查詢的機制
LocalStorage存儲容量也很小,大概不會超過10M,它是以鍵值對形式儲存資料的,同樣也沒有關聯查詢、條件查詢的機制
SessionStorage最大的問題是,每次關閉應用程式,它裡面的内容會被清空,想持久化存儲資料,就不用考慮它了
WebSql諸般特性都挺好,無奈這個技術已經被W3C委員會否決了,不知道哪天Electron也不支援了,到時就傻眼了
現在可選的成熟方案幾乎隻剩下SQLite和IndexedDB了,
SQLite是一個輕型的、嵌入式的SQL 資料庫引擎,其特點是自給自足的、無伺服器、零配置的、支援事務。它是在世界上最廣泛部署的 SQL 資料庫引擎。
IndexedDB是Chromium内置的一個基于JavaScript的面向對象的資料庫,在Electron應用内它存儲的容量限制與使用者的磁盤容量有關,是使用者磁盤大小的1/3
市面上選這兩個方案的商業産品各都有很多
那麼到底哪個好呢?
接下去我們就做一個性能的對比
CPU:I9 9900K 3.6GHZ
記憶體:32G
OS:Win10
通路SQLite資料使用的是knexjs操作庫,它是一個sql生成器,支援Promise API,鍊式操作非常好用,推薦使用
在Electron應用内安裝SQLite,比較特殊,需要使用如下安裝指令:
注意:--target後面的内容與你使用的Electron的版本要一緻
SQLite的資料庫表結構
這裡主要模拟了一個IM應用的消息表
SQLite的測試代碼如下
其中用到了messages是兩個消息體的JSON對象,代碼如下:
IndexedDB的測試代碼是在渲染程序中執行的,代碼如下:

已存在10000行資料的前提下,删除200行資料(毫秒):18、16、18
已存在10000行資料的前提下,删除8000行資料(毫秒):18
已存在10000行資料的前提下,删除10000行資料(毫秒):18
已存在10000行資料的前提下,删除200行資料(毫秒):21、10、10
已存在10000行資料的前提下,删除8000行資料(毫秒):58
已存在10000行資料的前提下,删除10000行資料(毫秒):30
已存在10000行資料的前提下,更新1行資料(毫秒):8、8、8、9、8、8
已存在10000行資料的前提下,更新100行資料(毫秒):30、30、28、30、30
已存在10000行資料的前提下,更新1行資料(毫秒):11、8、7、7、8、8
已存在10000行資料的前提下,更新100行資料(毫秒):15、14、12、10、13
結論:插入資料兩個資料庫性能相差巨大,IndexedDB顯然優于SQLite,檢索,删除,更新操作兩個資料庫性能相差無幾
分析:
SQLite有雙寫入機制,IndexedDB應該是有多級緩存寫入機制(待考),顯然多級緩存寫入機制更優秀
因為是Electron工程下完成此對比,是以Js經Electron轉到Node.js再轉到SQLite的Node module最後才轉到SQLite的C代碼,這個過程可能是性能損耗的一大主要原因
最後:
綜合對比下來,大型Electron應用更推薦使用IndexedDB來存儲業務資料
(由于有Dexie的加持,IndexedDB操作也足夠簡單,所有中小型應用也是不錯的選擇)
如果你需要加密用戶端資料,SQLite還需要外套sqlcipher這樣的加密庫,是以性能上會有更多損耗,
然而IndexedDB本身就有一層加密邏輯(可以說隻能防君子,防不了小人),雖然簡單,但聊勝于無。
歡迎大家購買我的新書《Electron實戰:入門、進階與性能優化》,
書裡還有更多有趣的内容,
大家感興趣可以加QQ群949674481交流。
當當:http://product.dangdang.com/28547952.html;
京東:https://item.jd.com/12867054.html