作者:舞影凌風
轉載地址:https://juejin.cn/post/6887800985272451086
開題
毋容置疑,MMKV是一款非常優秀的輕量級存儲框架,像百度、頭條、快手等應用都線上引用了,質量和性能上有微信實踐做保證。在Android上MMKV主要用來替換系統的sp,用來解決sp性能 + 不支持多進程問題,一些博客平臺對原理做了分析,我們今天就來談談MMKV的一些設計缺陷,或者說改進點。
存在的問題
0x1 數據存儲分了兩個文件,數據+校驗
先來介紹下MMKV的存儲結構,分了兩個文件,一個數據文件,存儲結構如下:
一個校驗文件,crc結尾,存儲結構如下:(新版本擴展了一些字節,圖是老的)
這種設計最直接問題就是佔用空間變大了很多,如下面的例子,只存儲了一個字段,但是爲了方便MMAP映射,磁盤直接佔用了8k的存儲,官方宣稱的protobuf存儲(可變長整型) 也省不回這個大小
另一方面就是操作兩個文件按理說出錯的概率會變大, 微信線上錯誤率很低問題不大,但是存儲在一個文件頭上其實是更好的設計,不知道官方是爲了向下兼容還是有其他考慮
0x2 數據存儲階段把類型擦除了
MMKV都是按字節進行存儲的,實際寫入文件把類型擦除了,這也是MMKV不支持getAll的原因,雖然說getAll用的不多問題不大,但是MMKV因此就不具備導出和遷移的能力了,比如說,以後出了更優秀的存儲框架,是沒有辦法直接從MMKV批量遷移到新框架的,除非代碼裏面寫死一個個key遷移
我覺得比較好的方案是每次存儲,多用一個字節來存儲數據類型,這樣佔用的空間也不會大很多,但是具備了更好的可擴展性
0x3 不方便調試
官方目前支持了5個平臺,Android、iOS、Win、MacOS、python,但是沒有提供解析數據的工具,數據文件和crc都是字節碼,除了中文能看出一些內容,直接查看還是存在大量亂碼。比如線上出了問題,把用戶的存儲文件撈上來,還得替換到系統目錄裏,通過代碼斷點去看,這也太不方便了。
敝人開發了一個MAC的工具(爲什麼不支持win? 只有mac本,也沒精力維護多端)來調試MMKV的文件,支持以上五個平臺產生的數據文件,使用也很簡單,直接拖入數據文件和crc文件就行。
界面預覽
加載完成後還需要自己手動選擇下類型,還是類型擦除的問題,不能直接讀取出結果
結束
看到這裏,你是不是明白了這篇文章的重點。_
希望各位大佬 star支持一下,能貢獻代碼就更棒了