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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

net.conn read 判断数据读取完毕_高并发:缓存模式以及缓存的数据一致性

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 net.conn read 判断数据读取完毕_高并发:缓存模式以及缓存的数据一致性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

緩存由于其高性能,支持高并發的特性,在高并發的項目中不可或缺。被大家廣泛使用的有Redis,Memcached等。本文主要探討幾種常見的緩存的讀寫模式,以及如何來保證緩存和數據庫的數據一致性。

這里大家可以關注一下我的個人專欄《PHP進階集中營》,每天會給大家即時分享一個最新的php技術資訊,有優秀的PHP技術內容,也歡迎分享在我的專欄。

PHP進階集中營?zhuanlan.zhihu.com

Cache-Aside

Cache-Aside可能是項目中最常見的一種模式。它是一種控制邏輯都實現在應用程序中的模式。緩存不和數據庫直接進行交互,而是由應用程序來同時和緩存以及數據庫打交道。Cache-Aside的名字正體現了這個模式,Cache在應用的一旁(aside)。

讀數據時

  • 程序需要判斷緩存中是否已經存在數據。
  • 當緩存中已經存在數據(也就是緩存命中,cache hit),則直接從緩存中返回數據
  • 當緩存中不存在數據(也就是緩存未命中,cache miss),則先從數據庫里讀取數據,并且存入緩存,然后返回數據
  • 寫數據時,我們可以有以下兩種策略:

    第一種策略:

  • 更新數據庫
  • 更新緩存
  • 但這種策略有線程安全的問題,可能出現緩存和數據庫不一致。試想有兩個寫的線程,線程A和線程B

  • A寫數據庫
  • B后于A寫數據庫
  • B寫緩存
  • A寫緩存
  • 緩存和數據庫中的數據不一致,緩存中的是臟數據
  • 要解決線程安全的問題,我們可以加鎖,不過實現起來比較麻煩,因此我們不考慮這種寫策略,而使用第二種策略。

    第二種策略:

  • 更新數據庫
  • 刪除緩存中對應的數據
  • 那么這種寫策略會有線程安全的問題嗎?有,試想一下有兩個線程,線程A讀,線程B寫

  • A讀數據,由于未命中那么從數據庫中取數據
  • B寫數據庫
  • B刪除緩存
  • A由于網絡延遲比較慢,將臟數據寫入緩存
  • 但是這種情況可能性非常的小,需要同時滿足很多條件,近乎不太可能發生,所以我們一般都采用這種寫策略。另外可以對緩存中的數據設置合適的過期時間,即使發生的臟數據的情況,也不會發生很長時間。

    應用場景

    應用于緩存不支持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 判断数据读取完毕_高并发:缓存模式以及缓存的数据一致性的全部內容,希望文章能夠幫你解決所遇到的問題。

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