摘要:但實際情況是緩存是大型網站的標配。以上分析告訴我們緩存架構要滿足冷熱分離的特征不滿足,因為冷數據可能擠走熱數據。另外,眾所周知,緩存架構還要滿足讀寫分離的特征也不滿足,因為寫操作會爭搶讀操作的資源。這種風格需要緩存系統的支持。
問題背景
略談服務端緩存設計 一文說到緩存不是必須的,因為數據庫本身就利用了內存。但實際情況是緩存是大型網站的標配。
雖然經驗顯示RDBMS最快時只需0~1ms就能響應,不遜于專門的緩存,但是當壓力增大時,性能的下降也是飛快的。隨著業務的逐漸復雜、開發團隊的逐漸擴大,難以全面優化所有的SQL,數據庫內存的命中率難免下降。
數據庫的連接數是有限的、磁盤的并發能力也很差,因此當訪問量增大或數據庫內存命中率下降,平均響應速度會陡然下降;更糟的是,某些查詢導致大量的冷數據換入并占用數據庫內存(例如全表掃描),真正最需要的熱數據暫時被擋在內存外,等到1~100ms(或更久)之后才能重新被讀入數據庫內存,到這種時候,壓力可能爆棚了。
MySQL的buffer pool hit rate指標統計了命中率。
MySQL有類似于分代LRU的機制,按這個鏈接調優能有所緩解。
以上分析告訴我們:緩存架構要滿足冷熱分離的特征——RDBMS不滿足,因為冷數據可能擠走熱數據。
另外,眾所周知,緩存架構還要滿足讀寫分離的特征——RDBMS也不滿足,因為寫操作會爭搶讀操作的資源。
鑒于這些局限性,RDBMS終歸還是頂不住,緩存成為大型網站的標配就是順理成章的了。
方案選擇略談服務端緩存設計 一文還比較了本地緩存和分布式緩存,首推分布式緩存。那么就要選擇一款緩存系統。而且強烈建議預先考慮水平擴展,如果先用了單機方案,之后很難不關機就在線遷移到基于sharding的集群方案。
緩存系統的選擇,我隨手列一些典型方案(沒有每個都用過),分成三系:
Memcached系:Twemproxy(手動rebalance),Couchbase
Redis系:Twemproxy(手動rebalance),Codis,官方的Redis Cluster
Java系:Apache Ignite(支持多種語言,兼容Memcached API),基礎性能低于前兩系,但支持SQL查詢、事務和豐富的數據結構,還能遠程執行代碼、推送事件通知、對接本地緩存/數據庫/HDFS等。同類產品有Hazelcast、Gemfire。
應用代碼怎么寫?通常是:讀操作先get緩存,若沒有,查數據庫,并且set緩存;寫操作直達數據庫,并且delete緩存。這種風格稱為直寫式緩存。
為避免重復代碼,可以利用AOP:Java可用Spring Cache,另外Hibernate可自動管理緩存;支持高階函數的語言自帶AOP,把數據操作變成閉包,外層包一個處理緩存的函數。
還有一種風格稱為寫回式緩存,讀寫操作都走緩存,由緩存來負責與數據庫同步。這種風格需要緩存系統的支持。
結語以上對問題背景和方案選擇都做了分析,尤其觸及一些知識盲點,然而這只是理論。
是的!鑒于實際環境的復雜性(即使是本篇文章也無法反映真實情況),最推薦的做法仍然是實測!根據真實的應用場景來設計你的緩存架構!(并不是只能線上實測,可以在測試環境盡量模擬。)
最后再推薦一些相關文章:
Pinterest談實戰經驗:如何在兩年內實現零到數百億的月訪問 http://www.qingjingjie.com/bl...
微博“異地多活”部署經驗談 http://www.infoq.com/cn/artic...
The Log: What every software engineer should know about real-time data"s unifying abstraction https://engineering.linkedin....
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64919.html
摘要:但實際情況是緩存是大型網站的標配。以上分析告訴我們緩存架構要滿足冷熱分離的特征不滿足,因為冷數據可能擠走熱數據。另外,眾所周知,緩存架構還要滿足讀寫分離的特征也不滿足,因為寫操作會爭搶讀操作的資源。這種風格需要緩存系統的支持。 問題背景 略談服務端緩存設計 一文說到緩存不是必須的,因為數據庫本身就利用了內存。但實際情況是緩存是大型網站的標配。 雖然經驗顯示RDBMS最快時只需0~1ms...
摘要:降級往往會指定不同的級別,面臨不同的異常等級執行不同的處理。談談你對和的認識兩者關系具體可以看公眾號阿里巴巴中間件的這篇文章獨家解讀從微服務框架到微服務生態與并不是競爭關系,作為成熟的框架,其易用性擴展性和健壯性已得到業界的認可。 該文已加入筆主的開源項目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項目),地址:https://github.com/...
摘要:降級往往會指定不同的級別,面臨不同的異常等級執行不同的處理。談談你對和的認識兩者關系具體可以看公眾號阿里巴巴中間件的這篇文章獨家解讀從微服務框架到微服務生態與并不是競爭關系,作為成熟的框架,其易用性擴展性和健壯性已得到業界的認可。 該文已加入筆主的開源項目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項目),地址:https://github.com/...
閱讀 1536·2023-04-26 02:08
閱讀 3128·2021-10-14 09:42
閱讀 7177·2021-09-22 15:34
閱讀 3236·2019-08-30 13:16
閱讀 2719·2019-08-26 13:49
閱讀 1342·2019-08-26 11:59
閱讀 1252·2019-08-26 10:31
閱讀 2170·2019-08-23 17:19