net.conn read 判断数据读取完毕_高并发:缓存模式以及缓存的数据一致性
緩存由于其高性能,支持高并發的特性,在高并發的項目中不可或缺。被大家廣泛使用的有Redis,Memcached等。本文主要探討幾種常見的緩存的讀寫模式,以及如何來保證緩存和數據庫的數據一致性。
這里大家可以關注一下我的個人專欄《PHP進階集中營》,每天會給大家即時分享一個最新的php技術資訊,有優秀的PHP技術內容,也歡迎分享在我的專欄。
PHP進階集中營?zhuanlan.zhihu.comCache-Aside
Cache-Aside可能是項目中最常見的一種模式。它是一種控制邏輯都實現在應用程序中的模式。緩存不和數據庫直接進行交互,而是由應用程序來同時和緩存以及數據庫打交道。Cache-Aside的名字正體現了這個模式,Cache在應用的一旁(aside)。
讀數據時
寫數據時,我們可以有以下兩種策略:
第一種策略:
但這種策略有線程安全的問題,可能出現緩存和數據庫不一致。試想有兩個寫的線程,線程A和線程B
要解決線程安全的問題,我們可以加鎖,不過實現起來比較麻煩,因此我們不考慮這種寫策略,而使用第二種策略。
第二種策略:
那么這種寫策略會有線程安全的問題嗎?有,試想一下有兩個線程,線程A讀,線程B寫
但是這種情況可能性非常的小,需要同時滿足很多條件,近乎不太可能發生,所以我們一般都采用這種寫策略。另外可以對緩存中的數據設置合適的過期時間,即使發生的臟數據的情況,也不會發生很長時間。
應用場景
應用于緩存不支持Read-Through/Write-Through的系統。
優點
- 緩存僅僅保存被請求的數據,屬于懶加載模式(Lazy Loading),和下文的Write-Through模式相比,避免了任何數據都被寫入緩存造成緩存頻繁的更新。
缺點
- 當發生緩存未命中的情況時,則會比較慢,因為要經過三個步驟:查詢緩存,從數據庫讀取,寫入緩存。
- 復雜的邏輯都在應用程序中,如果實現微服務,多個微服務中會有重復的邏輯代碼
Read-Through/Write-Through
這種模式中,應用程序將緩存作為主要的數據源,而數據庫對于應用程序是透明的,更新數據庫和從數據庫的讀取的任務都交給緩存來代理了,所以對于應用程序來說,簡單很多。
Read-Through
由緩存配置一個讀模塊,它知道如何將數據庫中的數據寫入緩存。在數據被請求的時候,如果未命中,則將數據從數據庫載入緩存。
Write-Through
緩存配置一個寫模塊,它知道如何將數據寫入數據庫。當應用要寫入數據時,緩存會先存儲數據,并調用寫模塊將數據寫入數據庫。
應用場景
Read Through/Write Through適用于寫入之后經常被讀取的應用。
優點
- 緩存不存在臟數據
- 相比較Cache-Aside懶加載模式,讀取速度更高,因為較少因為緩存未命中而從數據庫中查找
- 應用程序的邏輯相對簡單
缺點
- 對于總是寫入卻很少被讀取的應用,那么Write-Through會非常浪費性能,因為數據可能更改了很多次,卻沒有被讀取,白白的每次都寫入緩存造成寫入延遲。
除了Write-Through以外,我們還有另外的兩種寫模式可以和Read-Through一起來配合使用,分別是Write-Back和Write-Around。
Write-Back
又叫做Write-Behind。和Write-Through寫入的時機不同,Write-Back將緩存作為可靠的數據源,每次都只寫入緩存,而寫入數據庫則采用異步的方式,比如當數據要被移除出緩存的時候再存儲到數據庫或者一段時間之后批量更新數據庫。
應用場景
讀寫效率都非常好,寫的時候因為異步存儲到數據庫,提升了寫的效率,適用于讀寫密集的應用。
優點
- 寫入和讀取數據都非常的快,因為都是從緩存中直接讀取和寫入。
- 對于數據庫不可用的情況有一定的容忍度,即使數據庫暫時不可用,系統也整體可用,當數據庫之后恢復的時候,再將數據寫入數據庫。
缺點
- 有數據丟失的風險,如果緩存掛掉而數據沒有及時寫到數據庫中,那么緩存中的有些數據將永久的丟失了
Write-Around
和Write-Through不同,更新的時候只寫入數據庫,不寫入緩存,結合Read-Through或者Cache-Aside使用,只在緩存未命中的情況下寫緩存。
應用場景
適合于只寫入一次而很少被讀取的應用。
優點
- 相比較Write-Through寫入的時候的效率較高,如果數據寫入后很少被讀取,緩存也不會被沒用到的數據占滿。
缺點
- 如果數據會寫入多次,那么可能存在緩存和數據庫不一致
以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要點擊
總結
以上是生活随笔為你收集整理的net.conn read 判断数据读取完毕_高并发:缓存模式以及缓存的数据一致性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux安装i3wm桌面环境,Arch
- 下一篇: modbus协议手册_20种PLC元件编