微信MMKV原始碼閱讀隨筆
MMKV 是基於 mmap 記憶體對映的 key-value 元件,底層序列化/反序列化使用 protobuf 實現,效能高,穩定性強。從 2015 年中至今,在 iOS 微信上使用已有近 3 年,其效能和穩定性經過了時間的驗證。近期也已移植到 Android 平臺,一併開源。
二、總體設計

三、效能分析
1.單程序效能

(測試機器是 Pixel 2 XL 64G,Android 8.1,每組操作重複 1k 次,時間單位是 ms。)
2.多程序效能

(測試機器是 Pixel 2 XL 64G,Android 8.1,每組操作重複 1k 次,時間單位是 ms。)
四、使用方法
1.安裝引入
推薦使用 Maven:
dependencies { implementation 'com.tencent:mmkv:1.0.10' // replace "1.0.10" with any available version } 複製程式碼
2.初始化
在Application處初始化 MMKV.initialize(this);
3.增刪改查
預設使用單程序模式,如需切到多程序模式可使用MULTI_PROCESS_MODE,如果要使用多程序且用匿名記憶體,則使用MMKV.mmkvWithAshmemID(Context context, String mmapID, int size, int mode, String cryptKey)
MMKV kv = MMKV.defaultMMKV(); kv.encode("bool", true); boolean bValue = kv.decodeBool("bool"); kv.encode("int", Integer.MIN_VALUE); int iValue = kv.decodeInt("int"); kv.encode("string", "Hello from mmkv"); String str = kv.decodeString("string"); 複製程式碼
五、常見問題
Q1:匿名記憶體的作用?
A1:將資料存放於系統的一塊特殊記憶體區域,該記憶體區域會隨著APP的關閉而銷燬,可用於存放一些臨時檔案。
Q2:mmap的作用?
A2:用於分配出一塊記憶體,在MMKV裡,用這個函式將檔案對映到記憶體中,其中flags引數使用了MAP_SHARED,可以將映射出來的記憶體做的任何修改會通過系統反饋迴文件中,也就是隻需管理好這塊記憶體,檔案的讀寫交由系統完成,避免了奔潰導致資料丟失的情況。
Q3:為什麼這樣會比sp快?
A3:因為一切操作都直接在記憶體操作,並且資料結構都是使用Protobuf去實現,該結構採用二進位制存取資料,存取的時候,直接跳到指定位置,讀取指定大小,所以相當快。