資料存盤策略
? 在 iOS 應用程式中,從 “資料緩沖在哪里” 這個緯度看,緩沖一般分兩種型別,
- 記憶體緩沖
- 磁盤緩沖
? 記憶體緩沖是將資料緩沖在記憶體中,供應用程式直接讀取和使用,優點是讀取速度快,缺點是由于記憶體資源有限,應用程式在系統中申請的記憶體,會隨著應用生命周期結束而被釋放,會導致記憶體中的資料丟失,因此將事件資料緩沖到記憶體中不是最佳選擇,
? 磁盤緩沖是將資料緩沖到磁盤空間中,其特點正好和磁盤緩沖相反,磁盤緩沖容量打,但是讀寫速度對于記憶體緩沖要慢點,不過磁盤緩沖可以持久化存盤,不受應用程式生命周期影響,因為,將資料保存在磁盤中,丟失的風險比較低,即使磁盤緩沖資料速度較慢,但綜合考慮,磁盤緩沖是緩沖事件資料最優的選擇,
1.1 沙盒
? iOS 系統為了保證系統的安全性,采用了沙盒機制(即每個應用程式都有自己的一個獨立存盤空間),其原理就是通過重定向技術,把應用程式生成和修改的檔案重定向到自身的檔案中,因此,在 iOS 應用程式里,磁盤快取的資料一般都存盤在沙盒中,
? 我們可以通過下面的方式獲取沙盒路徑:
// 獲取沙盒主目錄路徑
NSString *homeDir = NSHomeDirectory();
? 在模擬上,輸出沙盒路徑示例如下:
/Users/renwei/Library/Developer/CoreSimulator/Devices/B1D7EC3E-BE72-4F8D-A4EF-E3D6316827CF/data/Containers/Data/Application/229B24A6-E13D-4DE6-9B52-363E832F9717
? 沙盒的根目錄下有三個常用的檔案夾:
- Document
- Library
- tmp
(1)Document 檔案夾
? 在 Document 檔案夾中,保存的一般是應用程式本身產生的資料,
? 獲取 Document 檔案夾路徑的方法:
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask , YES).lastObject;
/Users/renwei/Library/Developer/CoreSimulator/Devices/B1D7EC3E-BE72-4F8D-A4EF-E3D6316827CF/data/Containers/Data/Application/86212089-1D48-4B92-A919-AB87D3683191/Documents
(2) Library 檔案夾
? 獲取 Library 檔案夾路徑方法:
NSString *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask , NO).lastObject;
/Users/renwei/Library/Developer/CoreSimulator/Devices/B1D7EC3E-BE72-4F8D-A4EF-E3D6316827CF/data/Containers/Data/Application/4BBA5D3E-0C75-4543-B831-AE3344DCC940/Library
在 Library 檔案夾下有兩個常用的子檔案夾:
- Caches
- Preferences
? Caches 檔案夾主要用來保存應用程式運行時產生的需要持久化的資料,需要應用程式復制洗掉,
獲取 Caches 檔案夾路徑的方法
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask , YES).lastObject;
/Users/renwei/Library/Developer/CoreSimulator/Devices/B1D7EC3E-BE72-4F8D-A4EF-E3D6316827CF/data/Containers/Data/Application/38CEA9CA-4C49-4B94-84F3-16E434ABFE0F/Library/Caches
? Preferences 檔案保存的是應用程式的偏好設定,即 iOS 系統設定應用會從該目錄中讀取偏好設定資訊,因此,該目錄一般不用于存盤應用程式產生的資料,
(3)tmp 檔案夾
? tmp 檔案夾主要用于保存應用程式運行時引數的臨時資料,使用后在將相應的檔案從該目錄中洗掉,不會對 tmp 檔案中的資料進行備份,
? 獲取 tmp 檔案路徑的方法:
NSString *path = NSTemporaryDirectory();
/Users/renwei/Library/Developer/CoreSimulator/Devices/B1D7EC3E-BE72-4F8D-A4EF-E3D6316827CF/data/Containers/Data/Application/8E8906B8-0CBC-4A83-A220-A09F397304CD/tmp/
通過上面綜合對比發現,最適合快取事件資料的地方,就是 Library 下 Caches 檔案夾中,
1.2 資料快取
? 在 iOS 應用程式中,一般通過兩種方式進行磁盤快取:
- ? 檔案快取
- ? 資料庫快取
? 這兩種方式都是可以實作資料采集 SDK 的緩沖機制,緩沖的策略即當事件發生后,先將事件資料存盤在快取中,待符合一定策略后從快取中讀取事件資料并進行同步,同步成功后,將已同步的事件從快取中洗掉,
? 對于寫入的性能,SQLite 資料庫優于檔案快取.
? 對于讀取的性能:如果單條資料小于 100KB,則 SQLite 資料庫讀取的速度更快,如果單條資料大于 100KB,則從檔案中讀取的速度更快,
? 因此,資料采集 SDK 一般都是使用 SQLite 資料庫來快取資料,這樣可以擁有最佳的讀寫性能,如果希望采集更完整,更全面的資訊,比如采集用戶操作時當前截圖的資訊(一般超過100KB),檔案快取可能是最優的選擇,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/499690.html
標籤:其他
