計算機領域有很多思想被滲透在編程語言中與軟體產品中
一、寫入時復制(CopyOnWrite)
寫入時復制是計算機程式設計領域中的一種優化策略,其核心思想是,如果有多個呼叫者(Callers)同時要求相同的資源(如記憶體或者是磁盤上的資料存盤),他們會共同獲取相同的指標指向相同的資源,直到某個呼叫者視圖修改資源內容時,系統才會真正復制一份專用副本(private copy)給該呼叫者,而其他呼叫者所見到的最初的資源仍然保持不變,這程序對其他的呼叫者都是透明的(transparently),此做法主要的優點是如果呼叫者沒有修改資源,就不會有副本(private copy)被創建,因此多個呼叫者只是讀取操作時可以共享同一份資源,
CopyOnWriteArrayList :在寫入資料時就是采用該思想,由于寫入時復制,所以在讀寫并存的時候,他們操作的是不同的集合,也就是CopyOnWriteArrayList 只能保證資料的最終一致性,由于復制所以會占用更多記憶體,所以會增加GC次數,適用于讀多寫少的場景,
二、預寫日志 (Write-Ahead Logging )
在計算機科學中,預寫式日志是資料存盤系統在持久化資料時,為提高系統的處理效率常采用的技術,對于非記憶體資料庫而言,磁盤I/O操作是資料庫效率的一大瓶頸,在相同的資料量下,采用WAL日志的資料庫系統在事務提交時,磁盤寫操作只有傳統的回滾日志的一半左右,大大提高了資料庫磁盤I/O操作的效率,從而提高了資料庫的性能,
WAL機制的原理:修改并不直接寫入到資料庫檔案中,而是寫入到另外一個稱為 WAL 的檔案中;如果事務失敗,WAL 中的記錄會被忽略,撤銷修改;如果事務成功,它將在隨后的某個時間被寫回到資料庫檔案中,提交修改,
WAL與checkpoint
使用 WAL 的資料庫系統不會再每新增一條 WAL 日志就將其刷入資料庫檔案中,一般積累一定的量然后批量寫入,通常使用「頁」為單位,這是磁盤的寫入單位, 同步 WAL 檔案和資料庫檔案的行為被稱為 checkpoint(檢查點),一般在 WAL 檔案積累到一定頁數修改的時候;當然,有些系統也可以手動執行 checkpoint,執行 checkpoint 之后,WAL 檔案可以被清空,這樣可以保證 WAL 檔案不會因為太大而性能下降,有些資料庫系統讀取請求也可以使用 WAL,通過讀取 WAL 最新日志就可以獲取到資料的最新狀態,
- Mysql:關系資料庫系統中用于提供原子性和持久性(ACID 屬性中的兩個)的一系列技術,mysql 通過 redo、undo 日志實作 WAL,redo log 稱為重做日志,每當有操作時,在資料變更之前將操作寫入 redo log,這樣當發生掉電之類的情況時系統可以在重啟后繼續操作,undo log 稱為撤銷日志,當一些變更執行到一半無法完成時,可以根據撤銷日志恢復到變更之間的狀態,mysql 中用 redo log 來在系統 Crash 重啟之類的情況時修復資料(事務的持久性),而 undo log 來保證事務的原子性,
- Hbase:hbase 的 RegionServer 會將資料保存在記憶體中(MemStore),直到滿足一定條件,將其 flush 到磁盤上,這樣可以避免創建很多小檔案,記憶體存盤是不穩定的,HBase 也是使用 WAL 來解決這個問題:每次更新操作都會寫日志,并且寫日志和更新操作在一個事務中,
- elasticsearch:elasticsearch使用translog來記錄所有的操作,我們新增了一條記錄時,es會把資料寫到translog和in-memory buffer(記憶體快取區)中,默認是每 30 分鐘,執行flush 操作(Lucene 提交) 或者是在 translog 過大時(默認 512MB),translog每5秒鐘會同步到磁盤,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/280852.html
標籤:其他
