<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jack Jiang

    我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
    posts - 494, comments - 13, trackbacks - 0, articles - 1

    1、MMKV簡介

    騰訊微信團隊于2018年9月底宣布開源 MMKV ,這是基于 mmap 內存映射的 key-value 組件,底層序列化/反序列化使用 protobuf 實現,主打高性能和穩定性。近期也已移植到 Android 平臺,一并對外開源。

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

    MMKV最新源碼托管地址:https://github.com/Tencent/MMKV

    2、MMKV 源起

    在微信客戶端的日常運營中,時不時就會爆發特殊文字引起系統的 crash(請參見文章:《微信團隊分享:iOS版微信是如何防止特殊字符導致的炸群、APP崩潰的?》、《微信團隊分享:iOS版微信的高性能通用key-value組件技術實踐》),文章里面設計的技術方案是在關鍵代碼前后進行計數器的加減,通過檢查計數器的異常,來發現引起閃退的異常文字。在會話列表、會話界面等有大量 cell 的地方,希望新加的計時器不會影響滑動性能;另外這些計數器還要永久存儲下來——因為閃退隨時可能發生。

    這就需要一個性能非常高的通用 key-value 存儲組件,我們考察了 SharedPreferences、NSUserDefaults、SQLite 等常見組件,發現都沒能滿足如此苛刻的性能要求。考慮到這個防 crash 方案最主要的訴求還是實時寫入,而 mmap 內存映射文件剛好滿足這種需求,我們嘗試通過它來實現一套 key-value 組件。

    3、MMKV 原理

    內存準備:

    通過 mmap 內存映射文件,提供一段可供隨時寫入的內存塊,App 只管往里面寫數據,由操作系統負責將內存回寫到文件,不必擔心 crash 導致數據丟失。

    數據組織:

    數據序列化方面我們選用 protobuf 協議,pb 在性能和空間占用上都有不錯的表現。

    寫入優化:

    考慮到主要使用場景是頻繁地進行寫入更新,我們需要有增量更新的能力。我們考慮將增量 kv 對象序列化后,append 到內存末尾。

    空間增長:

    使用 append 實現增量更新帶來了一個新的問題,就是不斷 append 的話,文件大小會增長得不可控。我們需要在性能和空間上做個折中。

    更詳細的設計原理參考MMKV 原理

    4、iOS 指南

    安裝引入(推薦使用 CocoaPods):

    安裝CocoaPods

    打開命令行,cd到你的項目工程目錄, 輸入pod repo update讓 CocoaPods 感知最新的 MMKV 版本;

    打開 Podfile, 添加pod 'MMKV'到你的 app target 里面;

    在命令行輸入pod install;

    用 Xcode 打開由 CocoaPods 自動生成的.xcworkspace文件;

    添加頭文件#import <MMKV/MMKV.h>,就可以愉快地開始你的 MMKV 之旅了。

    更多安裝指引參考iOS Setup

    快速上手:

    MMKV 的使用非常簡單,無需任何配置,所有變更立馬生效,無需調用synchronize:

    MMKV *mmkv = [MMKV defaultMMKV];    [mmkvsetBool:YESforKey:@"bool"];BOOL bValue = [mmkvgetBoolForKey:@"bool"];    [mmkvsetInt32:-1024forKey:@"int32"];int32_t iValue = [mmkvgetInt32ForKey:@"int32"];    [mmkvsetObject:@"hello, mmkv"forKey:@"string"];NSString *str = [mmkvgetObjectOfClass:NSString.classforKey:@"string"];

    更詳細的使用教程參考iOS Tutorial

    性能對比:

    循環寫入隨機的int1w 次,我們有如下性能對比:

    更詳細的性能對比參考iOS Benchmark

    5、Android 指南

    安裝引入:

    推薦使用 Maven:

    dependencies{implementation'com.tencent:mmkv:1.0.10'// replace"1.0.10"with any available version}

    更多安裝指引參考Android Setup

    快速上手:

    MMKV 的使用非常簡單,所有變更立馬生效,無需調用sync、apply。 在 App 啟動時初始化 MMKV,設定 MMKV 的根目錄(files/mmkv/),例如在 MainActivity 里:

    protectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);    String rootDir = MMKV.initialize(this);    System.out.println("mmkv root: "+ rootDir);//……}

    MMKV 提供一個全局的實例,可以直接使用:

    importcom.tencent.mmkv.MMKV;//……MMKV kv = MMKV.defaultMMKV();kv.encode("bool",true);booleanbValue = kv.decodeBool("bool");kv.encode("int", Integer.MIN_VALUE);intiValue = kv.decodeInt("int");kv.encode("string","Hello from mmkv");String str = kv.decodeString("string");

    MMKV 支持多進程訪問,更詳細的用法參考Android Tutorial

    性能對比:

    循環寫入隨機的int1k 次,我們有如下性能對比:

    更詳細的性能對比參考Android Benchmark



    作者:Jack Jiang (點擊作者姓名進入Github)
    出處:http://www.52im.net/space-uid-1.html
    交流:歡迎加入即時通訊開發交流群 215891622
    討論:http://www.52im.net/
    Jack Jiang同時是【原創Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
    本博文 歡迎轉載,轉載請注明出處(也可前往 我的52im.net 找到我)。


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    Jack Jiang的 Mail: jb2011@163.com, 聯系QQ: 413980957, 微信: hellojackjiang
    主站蜘蛛池模板: 亚洲另类视频在线观看| 久久亚洲精品无码VA大香大香| 67194在线午夜亚洲| 日本一卡精品视频免费| 亚洲国产高清人在线| 久久爰www免费人成| 亚洲一级二级三级不卡| 2015日韩永久免费视频播放| 亚洲视频在线观看免费| 蜜桃AV无码免费看永久| 亚洲一区免费视频| 成人免费看吃奶视频网站| 国产成人人综合亚洲欧美丁香花 | 精品久久亚洲中文无码| 91成年人免费视频| 亚洲影院天堂中文av色| 国产精品久久久久影院免费| 人成午夜免费大片在线观看| 亚洲乱亚洲乱妇无码麻豆| 99精品视频免费观看| 亚洲国产熟亚洲女视频| 免费在线观看黄网| 免费精品一区二区三区第35| 亚洲精彩视频在线观看| 四虎成人免费观看在线网址| 日本精品久久久久久久久免费 | 78成人精品电影在线播放日韩精品电影一区亚洲 | 日本亚洲欧美色视频在线播放| 免费一级毛片免费播放| 成人性生交大片免费看中文| 亚洲精品亚洲人成在线麻豆| 在线观看免费大黄网站| 久久国产乱子伦精品免费午夜| 91亚洲一区二区在线观看不卡 | 日韩免费在线观看视频| 亚洲人成电影网站久久| 亚洲一级黄色视频| 四虎最新永久免费视频| 免费无码国产在线观国内自拍中文字幕| 亚洲国产三级在线观看| 在线观看视频免费国语|