對(duì)于數(shù)據(jù)的持久化存儲(chǔ),ios中一般提供了4種不同的機(jī)制。
成都創(chuàng)新互聯(lián)主要從事網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)監(jiān)利,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108
1.屬性列表
2.對(duì)象歸檔
3.數(shù)據(jù)庫(kù)存儲(chǔ)(SQLite3)
4.蘋(píng)果公司提供的持久性工具Core Data。
其實(shí)儲(chǔ)存的形式無(wú)非就這么幾種,而我們還必須要關(guān)心的是,這些文件會(huì)被放置在那個(gè)文件下,然后如何讀取。
也就是說(shuō):IOS上數(shù)據(jù)存儲(chǔ),我們要了解的兩點(diǎn),數(shù)據(jù)存儲(chǔ)格式(也就是存儲(chǔ)機(jī)制),數(shù)據(jù)存儲(chǔ)位置。
1》文件如何存儲(chǔ)(如上面4點(diǎn))
2》文件存儲(chǔ)在哪里。
對(duì)于數(shù)據(jù)的操作,其實(shí)我們關(guān)心的是操作的速率。
就好比在Adnroid中偏好存儲(chǔ),數(shù)據(jù)庫(kù)存儲(chǔ),io存儲(chǔ)一樣。
Apache Ignite是一個(gè)通用的數(shù)據(jù)庫(kù)緩存系統(tǒng),它不僅支持所有的底層數(shù)據(jù)庫(kù)系統(tǒng),比如RDBMS、NoSQL和HDFS,還支持Write-Through和Read-Through、Write-Behind Caching等可選功能。
WAL 是 write-ahead log 系統(tǒng),其核心思想是將用戶的所有修改操作(插入、刪除)寫(xiě)入日志,然后再應(yīng)用到系統(tǒng)狀態(tài)。一旦日志寫(xiě)入成功,就可以通知用戶操作成功。由于日志采用尾部追加方式寫(xiě)入,耗時(shí)較短,因此不會(huì)長(zhǎng)時(shí)間阻塞用戶線程。另外,為防止意外退出導(dǎo)致數(shù)據(jù)丟失,系統(tǒng)重啟時(shí)會(huì)根據(jù)日志重做用戶操作,保證數(shù)據(jù)可靠性。
WAL 一直是傳統(tǒng) RDBMS 系統(tǒng)中的一個(gè)共識(shí),用于幫助保證原子性和持久性(ACID 的 A 和 D)。對(duì)表的所有更新首先寫(xiě)入 WA),然后異步的方式使用。
示例 WAL 和 WALEntry 結(jié)構(gòu):
為什么不將更改直接刷新到實(shí)際數(shù)據(jù)文件?
它有2個(gè)方面——
WAL 是一個(gè)僅附加日志,它將數(shù)據(jù)存儲(chǔ)中的每個(gè)狀態(tài)更改存儲(chǔ)為日志。
一個(gè)單獨(dú)的異步進(jìn)程可以從 WAL 讀取操作,然后按照正常流程通過(guò)不同的緩存將數(shù)據(jù)更新應(yīng)用于磁盤(pán)上的實(shí)際數(shù)據(jù)文件,有助于提高數(shù)據(jù)存儲(chǔ)的寫(xiě)入吞吐量。
此外,如果發(fā)生故障,可能會(huì)有未應(yīng)用的更新,由于我們?cè)?WAL 文件中存在操作,我們可以從 WAL 重放操作并應(yīng)用它們以使數(shù)據(jù)存儲(chǔ)恢復(fù)到一致?tīng)顟B(tài)。因此,WAL 幫助我們確保數(shù)據(jù)的完整性和可靠性,同時(shí)仍然允許我們的數(shù)據(jù)存儲(chǔ)具有高寫(xiě)入吞吐量。
如前所述,對(duì)磁盤(pán)的寫(xiě)入可能不會(huì)直接刷新,考慮到寫(xiě)入系統(tǒng)中導(dǎo)致性能的問(wèn)題,需要進(jìn)行權(quán)衡刷新頻率或微批處理或兩者來(lái)將更改刷新到磁盤(pán),以幫助提高性能。請(qǐng)注意,此處存在數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
需要確保任何刷新到磁盤(pán)的操作都不會(huì)損壞, WAL 記錄還包含一個(gè) CRC 值,該值可用于驗(yàn)證何時(shí)從 WAL 讀取記錄并確保沒(méi)有損壞。
由于 WAL 是一個(gè)附加追尾的文件,因此如果客戶端由于通信故障而重試,可能會(huì)遇到在 WAL 上寫(xiě)入重復(fù)操作的情況。因此,每當(dāng)讀取 WAL 時(shí),要確保忽略重復(fù)項(xiàng),或者對(duì)應(yīng)用數(shù)據(jù)的動(dòng)作具有冪等性的。
1)所有數(shù)據(jù)庫(kù),包括像Cassandra這樣的NoSQL數(shù)據(jù)庫(kù)都使用WAL來(lái)保證持久性。
2) Kafka 使用了與 WAL(Commit Log) 類(lèi)似的結(jié)構(gòu)。
3) 像 Rocks DB、Level DB 這樣的 KV 存儲(chǔ)和像 Apache Ignite 這樣的分布式緩存也使用 WAL。
總而言之,WAL 提供一下價(jià)值
1) 更快的性能和吞吐量,避免了所有更改的數(shù)據(jù)刷新/磁盤(pán)寫(xiě)入。
2) 重啟時(shí)的可恢復(fù)性,操作可以從 WAL 應(yīng)用到實(shí)際的數(shù)據(jù)存儲(chǔ)。
3)能夠恢復(fù)到時(shí)間點(diǎn)快照,我們?cè)?WAL 中存在所有操作。