微信MMKV原始碼閱讀隨筆

ysbing發表於2018-09-25

一、功能介紹

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

二、總體設計

微信MMKV原始碼閱讀隨筆

三、效能分析

1.單程式效能

微信MMKV原始碼閱讀隨筆
(測試機器是 Pixel 2 XL 64G,Android 8.1,每組操作重複 1k 次,時間單位是 ms。)

2.多程式效能

微信MMKV原始碼閱讀隨筆
(測試機器是 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去實現,該結構採用二進位制存取資料,存取的時候,直接跳到指定位置,讀取指定大小,所以相當快。

Q4:跨程式的原理?

A4:程式A通過mmap分配的記憶體A,程式B通過mmap分配的記憶體B,B做了修改,A在每次讀取的時候,都需要重新讀一次檔案的狀態,通過檔案的大小和校驗碼,來得知檔案是否做過修改,如已修改,A需要重組記憶體,獲取到了B修改後的資料,從而實現跨程式,其中的讀寫安全操作,都需要加上檔案鎖來實現。





說的可能有不對的地方,望指出!

相關文章