日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MMKV_mmkv之基本介绍

發布時間:2023/12/20 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MMKV_mmkv之基本介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MMKV淺析

? MMKV 是微信開源的一個基于 mmap 內存映射的 key-value 組件,底層序列化/反序列化使用 protobuf 實現,性能高,穩定性強。微信團隊為了發現記錄特殊文字引起微信 iOS 系統的 crash,在關鍵代碼前后進行計數器的加減,通過檢查計數器的異常,來發現引起閃退的異常文字,但同時因為諸多cell的復雜頁面情境下希望新加的計時器不會影響性能,另外這些計數器需要永久存儲下來——因為閃退隨時可能發生,所以亟需高性能的通用 key-value 存儲組件,而微信團隊在實時寫入和高性能的選擇標準下,通過對比NSUserDefaults、SQLite 等常見組件,最終選擇了mmap 內存映射文件,并將其封裝成為了MMKV組件。下面我們來逐步進行了解

1.mmap簡介

? 認真分析mmap:是什么 為什么 怎么用這篇文章講的炒雞詳細,很佩服作者,本人也不想ctrl+c/v一遍, 。但在此處總結下:

mmap實現了一種使用內存映射到磁盤文件的方法,將本該屬于磁盤文件的對象映射到了進程地址空間中,實現文件磁盤地址和進程虛擬地址空間中一段虛擬地址的一一對映關系。實現這樣的映射關系后,進程就可以采用指針的方式讀寫操作這一段內存,而系統會自動(默認并不實時)回寫臟頁面到對應的文件磁盤上,即完成了對文件的操作而不必再調用read,write等系統調用函數,對文件直接通過內存映射讀取從而跨過了頁緩存,減少數據拷貝次數,用內存讀寫 取代I/O讀寫,提高文件讀取效率。另外,內核空間對這段區域的修改也直接反映用戶空間,從而可以實現不同進程間的文件共享,從而達到進程間通信和進程間共享的目的。簡言之,很強大。

2.protobuf

? 在數據序列化方面微信團隊選用了protobuf 協議,出于通用化的考慮將多樣化的 value 通過 protobuf協議序列化成統一的內存塊(buffer),然后再進行相應存儲。

2.1 protobuf是什么

protobuf是一種靈活高效的序列化結構機制,就像xml,但是protobuf更輕量、更快并且更簡單。一旦你限定了你想要的數據結構,那么你就可以使用特殊的構建代碼實現對大量數據結構的讀寫,并且支持多種語言哦~你甚至可以更新你的數據構建,哪怕新的數據結構與老的完全相反,這絲毫不影響已經部署完成的程序。

也就是說protobuf幫我們輕松實現了序列化和反序列化,即使變更數據結構,也不會產生太大的影響,這對于數據結構多變的實際業務場景來說簡直太有必要了。

3.寫入優化&空間增長

? 因為標準 protobuf并 不提供增量更新的能力,每次寫入都必須全量寫入。 查看代碼我們也能看到最底層調用的方法是使用的append而非直接替換:

但是這樣就會引發兩個問題:

1.很大程度上可能存在相同key但是存儲了多個不同的value。? 2.不斷 append 的話,文件大小會增長得不可控。

針對這兩個問題的處理方式是:

1.在程序啟動第一次打開 mmkv 時,不斷用后讀入的 value 替換之前的值,就可以保證數據是最新有效的。

2.對于空間增長的問題:以內存 pagesize 為單位申請空間,在空間用盡之前都是 append 模式;當 append 到文件末尾時,進行文件重整、key 排重,嘗試序列化保存排重結果;排重后空間還是不夠用的話,將文件擴大一倍,直到空間足夠。所以在每次append之前都會先調用- (BOOL)ensureMemorySize:(size_t)newSize;方法檢查一下是否有足夠空間,如果沒有則按照每次2倍的大小去擴展空間:

3.另外針對空間增長,mmkv還提供了- (void)trim;方法來提供了通過手動調用減小多余占用內存的功能,正如每次擴增時按2倍擴增,縮減時也是每次除以2:

4.crc 校驗

? 微信團隊考慮到文件系統、操作系統都有一定的不穩定性,另外增加了 crc 校驗,對無效數據進行甄別,根據微信提供的數據:在 iOS 微信現網環境上,觀察到有平均約 70w 日次的數據校驗不通過。

4.1 crc 校驗簡介

? CRC即循環冗余校驗碼(Cyclic Redundancy Check):是數據通信領域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環冗余檢查(CRC)是一種數據傳輸檢錯功能,對數據進行多項式計算,并將得到的結果附在幀的后面,接收設備也執行類似的算法,以保證數據傳輸的正確性和完整性。也就是接受方和發送方約定一個用來計算的二進制數(比如x),在整個傳輸過程中,這個數始終保持不變。循環冗余校驗碼(CRC)的基本原理是:在K位信息碼后再拼接R位的校驗碼,整個編碼長度為N位,因此,這種編碼也叫(N,K)碼。那么發送方發送時根據約定的x計算出要補全在K位信息碼后的R位校驗碼,然后發送,接收方接收到數據之后通過約定好的x對收到的數據進行校驗,即可查驗在數據傳輸過程中有否出錯。

對比結果

另外相比較NSUserDefaults還需要手動調用synchronize保存來說,MMKV為自動保存,無需手動調用同步。

總結

以上是生活随笔為你收集整理的MMKV_mmkv之基本介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。