隨著應(yīng)對大規(guī)模交易的Web應(yīng)用程序、SOA和其他服務(wù)器應(yīng)用程序的爆炸式增長,數(shù)據(jù)存儲無法跟上應(yīng)用增長速度,因?yàn)閿?shù)據(jù)存儲無法繼續(xù)添加更多服務(wù)器以擴(kuò)展,這與可擴(kuò)展性極高的應(yīng)用架構(gòu)不同。
創(chuàng)新互聯(lián)建站成都網(wǎng)站建設(shè)按需定制開發(fā),是成都營銷推廣公司,為成都小攪拌車提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺程序開發(fā)等。成都網(wǎng)站維護(hù)熱線:13518219792
在這種情況下,內(nèi)存分布式緩存為數(shù)據(jù)存儲瓶頸提供了極好的解決方案。它跨越多個(gè)服務(wù)器(稱為集群)將內(nèi)存集中在一起,并保持所有服務(wù)器之間的高速緩存同步,并且可以像應(yīng)用程序服務(wù)器一樣不斷增長高速緩存集群,這減少了數(shù)據(jù)存儲的壓力,使其不再是可擴(kuò)展性的瓶頸。
分布式緩存主要有兩種使用方式:
·Cache:這是應(yīng)用程序負(fù)責(zé)讀取和寫入數(shù)據(jù)庫的地方,Cache不與數(shù)據(jù)庫交互。Cache“kept aside”為更快,更具可擴(kuò)展性的內(nèi)存數(shù)據(jù)存儲。應(yīng)用程序在從數(shù)據(jù)庫讀取任何內(nèi)容之前需要檢查Cache。并且,應(yīng)用程序在對數(shù)據(jù)庫進(jìn)行更新后會自動更新Cache,保證應(yīng)用程序可以確保Cache與數(shù)據(jù)庫內(nèi)數(shù)據(jù)的同步。
·read-through/write-through(RT / WT):這是應(yīng)用程序?qū)ache視為主數(shù)據(jù)存儲并從中讀取數(shù)據(jù)向其寫入數(shù)據(jù)的位置。緩存負(fù)責(zé)將這些數(shù)據(jù)讀寫到數(shù)據(jù)庫,從而減輕應(yīng)用負(fù)擔(dān)。Read-Through,業(yè)務(wù)代碼首先調(diào)用Cache,如果Cache不命中由Cache回源到SoR,而不是業(yè)務(wù)代碼(即由Cache讀SoR)。Write-Through,稱之為穿透寫模式/直寫模式,業(yè)務(wù)代碼首先調(diào)用Cache寫(新增/修改)數(shù)據(jù),然后由Cache負(fù)責(zé)寫緩存和寫SoR,而不是業(yè)務(wù)代碼。
▲通讀式/直寫式緩存架構(gòu)
Cache-aside是一種非常強(qiáng)大的技術(shù),即業(yè)務(wù)代碼圍繞Cache寫,是由業(yè)務(wù)代碼直接維護(hù)緩存,可以讓用戶進(jìn)行復(fù)雜的數(shù)據(jù)庫查詢,包括連接和嵌套查詢,并以任何用戶想要的方式處理數(shù)據(jù)。盡管如此,Read-through / Write-through與Cache相比具有各種優(yōu)勢,如下所述:
·簡化應(yīng)用程序代碼:在Cache-aside方法中,如果多個(gè)應(yīng)用程序處理相同的數(shù)據(jù),則應(yīng)用程序代碼將繼續(xù)具有復(fù)雜性并直接依賴于數(shù)據(jù)庫,甚至?xí)貜?fù)執(zhí)行代碼。Read-through / Write-through將部分?jǐn)?shù)據(jù)訪問代碼從應(yīng)用程序移至Cache層,極大地簡化了應(yīng)用程序并更加清晰地提取數(shù)據(jù)。
·通過Read-through更好地實(shí)現(xiàn)可伸縮性:在許多情況下,緩存項(xiàng)到期并且多個(gè)并行用戶線程最終觸發(fā)數(shù)據(jù)庫,將其與數(shù)以百萬計(jì)的緩存項(xiàng)和數(shù)以千計(jì)的并行用戶請求相乘,數(shù)據(jù)庫負(fù)載明顯變高。但是,當(dāng)從數(shù)據(jù)庫獲取最新副本時(shí),“Read-through”將cache-item保存至緩存中,同時(shí)從數(shù)據(jù)庫中獲取最新副本。最終結(jié)果是應(yīng)用程序永遠(yuǎn)不會去數(shù)據(jù)庫獲取這些cache-items ,并且數(shù)據(jù)庫負(fù)載保持最小。
·使用Write-behind獲取更好得寫入性能:在cache-aside中,應(yīng)用程序直接同步更新數(shù)據(jù)庫。Write-behind可讓應(yīng)用程序快速更新緩存并返回。然后,讓cache在后臺更新數(shù)據(jù)庫。
·使用Write-behind更好地實(shí)現(xiàn)數(shù)據(jù)庫可伸縮性:使用Write-behind,用戶可以指定限制條件,因此數(shù)據(jù)庫寫入速度不會像緩存更新那樣快,因此數(shù)據(jù)庫壓力不會太大。此外,用戶可安排數(shù)據(jù)庫寫入在非高峰時(shí)段進(jìn)行,再次將壓力降至最低。
·到期自動刷新緩存:使用Read-through ,Cache可自動從數(shù)據(jù)庫重新加載對象。這意味著應(yīng)用程序不必在繁忙時(shí)間點(diǎn)擊數(shù)據(jù)庫,因?yàn)樽钚碌臄?shù)據(jù)總是在Cache中。
·數(shù)據(jù)庫更改時(shí)自動刷新Cache:當(dāng)數(shù)據(jù)庫中相應(yīng)的數(shù)據(jù)發(fā)生更改時(shí),Read-through 允許Cache自動從數(shù)據(jù)庫中重新加載對象。 這意味著緩存總是最新的,并且應(yīng)用程序不必在繁忙時(shí)間點(diǎn)擊數(shù)據(jù)庫,因?yàn)樽钚碌臄?shù)據(jù)總是在Cache中。
“讀取/寫入”(RT/WT)不適用于應(yīng)用程序中的所有數(shù)據(jù)訪問,最適合從數(shù)據(jù)庫讀取單個(gè)行或讀取可直接映射到單個(gè)緩存項(xiàng)數(shù)據(jù)的情況。即使數(shù)據(jù)周期性變化,頻繁讀取也是在Cache中實(shí)現(xiàn)。
開發(fā)Read-Through Handler
Read-Through Handler向cache服務(wù)器注冊,并允許cache直接從數(shù)據(jù)庫讀取數(shù)據(jù)。 NCache服務(wù)器提供了一個(gè) Read-through handler接口。 這使NCache能夠調(diào)用Read-through處理程序。
Start()執(zhí)行某些資源分配任務(wù),例如建立到主數(shù)據(jù)源的連接,而Stop()則意味著重置所有分配,Load是cache用于調(diào)用read-through對象的方法。
開發(fā)Write-Through Handler
當(dāng)cache需要在更新緩存時(shí)寫入數(shù)據(jù)庫時(shí),將調(diào)用Write-Through Handler。 通常,應(yīng)用程序通過添加,插入或刪除向cache發(fā)布更新。
Start()執(zhí)行資源分配任務(wù),例如建立到數(shù)據(jù)源的連接,而Stop()意味著重置所有分配, Save是緩存調(diào)用write-through對象的方法。
從應(yīng)用程序調(diào)用Read-Through和Write-Through
以下示例代碼展示了如何使用來自簡單Windows應(yīng)用程序cache的read-through/write-through功能。