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