继夫的玩弄H辣文的小说|女人与拘性猛交视频|精品欧美高清不卡高清|一起做亏亏的事情的视频|啦啦啦在线视频观看|望月直播下载ios版本|国产日韩欧美一区二区三区

如何保證本地緩存、分布式緩存、數據庫之間的數據一致性?

很高興能夠看到和回答這個問題,作為一個科技愛好者 , 我每天都在科技發展方面的消息,每天收獲也蠻多的 。
首先,我覺得這是一個非常好的問題 , 也是很多小白用戶困惑之處 , 下面我將根據自己的經驗認真回答這個問題 。
分布式類型高速緩存現在是許多分布式應用程序中必不可少的組件 , 但是如果以分布式格式使用高速緩存,則它可能與高速緩存和雙數據庫關聯 。如果您寫兩次,那么數據序列肯定會出現問題,您該如何解決兼容性問題?
最經典的緩存+數據庫模式是“緩存備用模式”
讀取高速緩存,不帶單詞的高速緩存,讀取數據庫,然后刪除數據并將其放入高速緩存中,然后作為響應進行回調 。更新數據庫 , 然后刪除緩存 。
為什么要刪除緩存而不更新緩存?
原因是在許多情況下 , 緩存是復雜點的場景,緩存不只是從數據庫輸出 。例如,您可以先更新一個表字段,然后再更新相應的緩存 。為了計算最新的緩存值,有必要從另外兩個表中請求數據并執行操作 。
有時,更新緩存的成本非常高 。這是否意味著每次對數據庫進行更改時,都需要更新相應的緩存?也許有這樣的場景,但是對于更復雜的緩存腳本 , 情況不再如此 。如果您經常更改緩存 , 那么它也會經常更新 。但是問題在于緩存將不經常可用嗎?
如果添加栗子,則包括表字段的緩存將更改20次或在1分鐘內更改100次 , 然后將緩存更新20次和100次,但是每分鐘僅讀取一次緩存,其中包含有關冷的大量數據 。實際上,如果您只是刪除緩存,那么在一分鐘之內就可以對緩存進行簡單的重新計數 , 并且所花費的費用比緩存要少得多 。
實際上,刪除緩存而不是更新緩存是一種惰性計算的思想,無論是否使用緩存,都不要每次都進行復雜的計算,而是在必要時重新進行計算 。就像,冬眠一樣,每個人都認為自己很懶 。應部門的要求,部門帶來了一份員工名單 , 無需說出每個部門的要求,它還包含1000名員工的數據 。在80%的情況下,檢查該扇區足以訪問有關該扇區的信息 。首先檢查部門 , 還聯系內部的員工,然后僅當您要訪問數據庫中的人員時,才可以聯系1000名員工 。
緩存問題和解決方案
問題:首先更改數據庫 , 然后刪除緩存 。如果緩存刪除錯誤,則將導致以下事實:數據庫中的數據將是新的,緩存中的數據將是舊的,并且數據將不一致 。
解決方案:首先刪除緩存,然后修改數據庫 。如果數據庫更改錯誤,則表明數據庫中有舊數據,并且高速緩存為空 , 則數據不會彼此不同 。由于無法讀取緩存 , 因此請讀取數據庫中的舊數據并在緩存中進行更新 。
分析更復雜的數據不一致問題
更改了數據,首先刪除了緩存,然后對數據庫進行了更改 , 直到進行了更改 。讀取緩存的一個請求,發現緩存為空,轉到數據庫 , 在進行更改之前找到了舊數據,并將其放入緩存中 。數據修改程序已完成數據庫的更新 。
一切都消失了,數據庫和數據中的緩存不相似…
為什么緩存與腳本結合使用時會產生數十億的高流密度的問題?
僅當同時讀取和寫入數據時,才會出現此類問題 。實際上,如果您的并行增長非常低,尤其是閱讀和分發 , 則每天的訪問量為10,000,那么在極少數情況下,就會出現剛才提到的不一致的情況 。但是,問題在于,如果流的日流量為每秒1億,則如果請求更新數據,則上述數據庫+緩存之間可能不匹配 。
解決方法如下:
當更新數據時 , 根據單個數據標識符 , 將在發送到jvm內部隊列后沿該路由執行操作 。當讀取數據時,如果在緩存中找不到數據 , 則會根據將發送到jvm內部隊列的唯一標識路由,重新讀取數據并更新緩存操作 。
隊列對應于一個工作討論,每個討論按順序執行 , 然后執行一篇文章 。因此,數據修改操作首先刪除高速緩存,然后更新數據庫 , 但不更新它 。同時,如果讀取了讀取請求且緩存為空 , 則可以先將請求更新緩存以發送到隊列 。此時,隊列中的滯后將累積,然后同步將等待緩存更新完成 。
這里有一個優化點 , 一個隊列中沒有幾個請求一起更新緩存,因此您可以過濾是否已經有更新隊列中的緩存的請求,您不需要在隊列中輸入更新請求 , 只需等到請求更新將完成 。
在此隊列完成上一個操作的數據庫中的更改之后,將執行下一個操作,即緩存將被更新 。在這種情況下 , 將讀取數據庫中的最后一個值并將其輸入到高速緩存中 。
如果該請求仍在可及范圍內,并且事實證明該請求可用,則立即返回;如果等待時間超過一定時間,則這次將直接從數據庫中讀取當前的舊值 。
在高度一致的情況下,該解決方案需要注意:
1.Ready請求被長時間阻止
由于讀取請求非常輕巧且異步,因此必須注意讀取延遲,并且每個讀取請求都應在等待時間內返回 。
該決定主要是由于很可能會經常更新數據,這導致以下事實:隊列中積累了大量更新操作,然后在讀取請求中發生了許多中斷,最終導致大量查詢直接進入數據庫 。有必要通過進行一系列模擬和實際測試來檢查數據更新的頻率 。
此外,由于在其中一個隊列中可能存在積壓的多個位置更新數據 , 因此有必要考慮到您自己的操作來檢查它們,因此您可能需要部署多個服務 , 每個服務都將分發部分數據更新操作 。如果在存儲隊列中您確實從修改庫存中擠出了100種商品,則每次庫存更改需要10毫秒才能完成時 , 那么讀取最后一種商品的請求可能會等待10*100==1s來接收數據,這會導致較長的讀取延遲要求 。
必須根據實際操作系統進行幾次壓力測試 , 并對網絡環境進行建模,以查看內存隊列有多繁忙可以產生更新,這可能導致對應于讀取請求的最新更新,如果讀取請求返回200ms,則掛起要花多長時間如果您甚至計算出最緊張的時間,即10次更新的滯后 , 最多200ms,那么這是可能的 。
如果大量更新可以在內存隊列中累積 , 那么您需要添加設備,以使部署在計算機上的服務的每個實例處理的數據更少,那么隊列中累積的更新數量將減少 。
實際上,根據先前項目的經驗,數據記錄的頻率通常很低 , 因此在實踐中,通常 , 在隊列中更新的滯后應該微不足道 。與該項目有關讀取和讀取緩存的體系結構的情況一樣,寫入請求通常非常少,每秒QPS可以達到數百 。
1、實際流利度計算
如果在一秒鐘內執行500次寫入操作,如果除以5個計時器,每次操作以及該存儲隊列中的20個操作,則每個存儲隊列可能會延遲5次寫入操作 。通常java簡單實現一個阻塞隊列 , 在每次記錄性能測試之后,大約需要20ms,然后讀取每個內存隊列中的數據的請求也將掛起一會兒,可以返回200ms 。
經過簡單的測量,我們知道支持一臺機器成百上千個QPS并不是問題,如果將QPS記錄增加10倍 , 則該機器將擴展10倍,每臺機器20個隊列 。
2、讀取請求過多
還必須在此處進行壓力測試java簡單實現一個阻塞隊列,以確保在遇到上述情況時,存在服務意外的大量讀取請求被延遲數十毫秒的風險,以使服務了解如何進行服務不可用,以及需要多少輛汽車才能承受最大峰值 。
但是,由于并非同時更新所有數據 , 因此高速緩存不會同時過期,因此,每次高速緩存中可能會丟失多個數據時 , 此數據將成為讀取請求,并且它們的數量不是應該特別大 。
3、多服務路由請求部署示例
也許此服務包含幾個示例 , 所以有必要確保通過Nginx服務器將數據更新操作的執行以及緩存更新請求的執行定向到同一服務目錄 。
例如,請求讀取和寫入同一產品 , 到同一機器的整個路徑 。您可以根據所請求的參數之一沿著哈希路由前往服務辦公室,也可以使用Nginx哈希路由 , 依此類推 。
4、熱貨路線問題,導致要求
如果讀取和寫入產品的順序特別高,則與在同一臺計算機上相同的隊列中的所有內容都可能對同一臺計算機造成過大的壓力 。這意味著 , 由于僅在更新產品數據時才清除緩存,然后它們導致讀寫,實際上是看業務系統 , 如果刷新率不太高,則此問題的后果不會特別明顯很好,但是,當然 , 某些汽車上可能會有很大的負載 。
以上便是我的一些見解和回答,可能不能如您所愿,但我真心希望能夠對您有所幫助!不清楚的地方您還可以我的頭條號“每日精彩科技”我將竭盡所知幫助您!
碼字不易,感覺寫的還行的話,還請點個贊哦!
【如何保證本地緩存、分布式緩存、數據庫之間的數據一致性?】本文到此結束 , 希望對大家有所幫助 。