系統設計 如何使用快取

2021-07-27 17:24:29 字數 2263 閱讀 7672

一 引言

在構建和維護業務服務應用時,大多數情況下業務系統的效能瓶頸往往是在資料庫,解決應用到資料庫之間瓶頸,系統的效能會得到極大提公升。系統的資料庫效能優化方法有很多:

從底層到上層有資料庫模型設計,sql優化,使用快取等等。從圖中的優化模式來看,其中資料庫模型設計的合理程度奠定了應用系統優化的基石,如果模型設計得不合理,那麼統隨著業務發展,系統後續的優化困難重重,另一方sql優化也是資料庫優化的乙個重要方面,慢sql和 topsql往往是系統效能殺手,它們是導致系統故障的重要潛在危險;還有乙個就是今天和大家一起**的是應用快取。

快取在系統的效能優化中有著舉足輕重的作用,它比sql優化 所帶來的效果更直接,更高效。但是相比其他優化手段,快取的使用並不是零成本的,任何系統使用快取,都會遇到兩大問題:

第一,資料不一致問題;

第二,系統複雜度大幅度增加;

這給系統的維護和測試增加了一定的成本,所以快取的設計就顯得非常重要了,糟糕的快取設計可能讓系統累贅不堪,而且讓系統變得極難以維護。另外對於不同型別的資料,由於實時性,準確性,複雜性的不同,快取的策略也有些不同。

二 如何設計快取

其實快取的設計面臨三個問題,快取哪些資料,怎麼快取,怎麼保證資料一致性。

2.1 快取哪些資料

系統優化時有一句話必須切記:「優化是無止境的」,所以如果快取不是必須的,請去掉它,要知道越是業務上覆雜的系統,對cache的使用反而越簡單,這是因為對於乙個複雜、多變、歷史悠久的系統,在cache方面做過度設計會讓人深陷其中;快取的資料越多,系統的維護成本就越高,所以找準需要快取的點尤為重要。一般情況下,我們只會快取給系統帶來巨大瓶頸的io操作,在普通應用裡尤其指由top sql 或者慢 sql 所帶來的dao查詢;找準需要優化的sql,你可以找dba幫忙。

2.2 怎麼快取

快取的方式:快取的方式一般都非常簡單,很多時候我們都經常快取乙個方法的執行結果:

public void getdata()}

如果快取的新增比較多,重複的為每個方法都新增一模樣的快取**非常不方便,我們很容易會想到用aop去做方法的快取框架,然後用@註解去為方法新增快取。其實spring3.1已經有現成的快取框架了,使用@cacheable 注釋可以很方便的為某個方法新增快取(有興趣的讀者可以去查閱資料研究)

@cacheable

public object getdata()

當然實際上新增快取沒有那麼簡單,你還有很多事要去做,比如我們下面要談到的,怎麼保證資料的一致性。

2.3 

怎麼保證資料一致性

資料的一致性,其實就是快取與資料來源的同步機制,這非常重要,它其實直接確定了你的快取策略是什麼樣的,一般快取的同步模式我把它分為以下幾種:

a. cache miss reload 

b. update then setcache 

c. 補償機制 

d. reload(rebuilt)all 等,每種同步機制各有優缺點,在我們的實踐中,經常把這幾種方法相結合;

【cache miss reload】:最簡單,就是上面getdata()函式的方式,它的好處是**較為簡潔,資料同步時在資料庫cud的時候,將快取失效即可,如果業務對資料實時性要求不高,可以直接設定快取失效時間,而不需要去手動失效它,這可以讓**達到最簡的地步;壞處是當快取失效瞬間,所有的請求都會經過資料庫(呼叫getdatafromdb()函式),可能導致資料庫壓力過大

,導致快取一直加不上,可能會引發db故障。

【update then setcache】:顧名思義就是在快取的資料更新的同時也觸發程式

更新快取:

public void updatedata(object data)}

這可以在很大程度上避免上述所說的快取失效雪崩效應;壞處是由於併發的原因,存在極小機率你更新的快取會導致髒資料進入快取中,可以採用tair提供的 version 引數避免髒資料進入tair中,不過編碼複雜度又上公升了。

【補償機制】有些時候快取的更新不一定能夠成功,也有可能會有髒資料進入快取,如果要確保資料『絕對』一致性,我們可以採取適當的補償機制,如 定時從資料庫的值更新到快取,或者在更新快取失敗時,插入失敗日誌,定時重新執行快取更新等

【reload(rebuilt)all】 有些時候你會發現上面的所有同步模式都不生效了,因為有些查詢物件的寫遠大於讀(可能是因為最初的資料庫設計並沒有讀寫分離),那麼這是如果一定要快取它的話,那可能就要以犧牲一部分的資料實時性為代價了,我們一般採用定時程式 reload或rebuilt所有的快取;

三 小結

在系統優化的過程中,快取的使用也是一門藝術。本文闡述了應用系統使用cache的一般性原則,希望對各位讀者在使用快取方面有一定的幫助。

系統設計 如何讓系統容易擴充套件?

乙個高可擴充套件性指標,表示可以通過增加機器的方式來線性提高系統的處理能力,從而承擔更高的流量或者併發數。在單機系統中通過增加處理核心數來增加系統的並行處理能力,但是這個方法並不總生效,隨著並行的任務增多,系統會因為爭奪資源而達到效能上的拐點。系統效能會不公升反降。多台機器組成的機器系統也類似,在集...

基於RBAC模型的許可權設計 如何設計系統許可權體系?

通過rbac建立後台許可權體系。什麼是許可權體系呢,比如,在系統中a分站的使用者不能看到b分站的資料,業務員能看到自己的資料而看不到其他業務員的資料,業務經理可以看到所有業務員的資料,業務經理和財務經理擁有的功能許可權又不相同,這些場景,都是通過許可權控制完成的。對於後台產品,一定是多使用者多角色多...

mysql 主鍵設計 如何設計mysql的主鍵?

如何設定mysql的主鍵?在一張資料表中,主鍵的作用是很極其重要的,那麼在資料表中如何設計mysql的主鍵?今天給大家介紹主鍵的設計原則。mysql資料庫中,主鍵是是資料庫物理模式的基石,其重要性自然不言而喻,下文為您介紹的就是mysql主鍵的設計原則,供您參考。學習mysql資料庫,mysql主鍵...