java中常用的缓存流程、缓存分类、缓存问题
一、概念
????????緩存就是數據交換的緩沖區(稱作:Cache),當某一硬件要讀取數據時,會首先從緩存匯總查詢數據,有則直接執行,不存在時從內存中獲取。由于緩存的數據比內存快的多,所以緩存的作用就是幫助硬件更快的運行
二、目的
通過提高服務的性能從而提高應用的用戶體驗。
系統性能指標:響應時間、延遲時間、吞吐量、并發用戶數量和資源利用率
吞吐量:系統在單位時間內處理的請求的數量
?三、流程
???????前臺請求,后臺先從緩存中取數據,取到直接返回結果,取不到時從數據庫中取,數據庫取到更新緩存,并返回結果,數據庫也沒取到,那直接返回空結果。
四、分類
根據位置分類
1、客戶端緩存:
對于BS架構的互聯網應用來說客戶端緩存主要分為頁面緩存和瀏覽器緩存兩種,對于APP而言主要是自身所使用的緩存
2、網絡中緩存:
網絡中的緩存主要是指代理服務器對客戶端請求數據的緩存,主要分為WEB代理緩存和邊緣緩存(CDN邊緣緩存)
3、服務端緩存
從系統的架構上面區分可以將緩存分為
? ? ? ?3.1?、服務器本地讀緩存(localCache)
????????本地緩存是一級緩存,位于服務本機的內存中,在操作本地緩存的時候不需要網絡IO不需要文件IO,直接從本機內存中讀取數據,因此讀寫速度最快。
本地緩存存在的問題:
????????本讀緩存數據直接保存在JVM中,需要考慮緩存數據的大小、JVM的垃圾回收性能消耗
單服務是集群部署的時候,應該考慮是否需要做集群中本地緩存的數據同步
在實際的開發中可以自己實現簡單的本地緩存也可以使用開源的本地緩存框架,比如:ehcache、JBoss Cache等
? ? ? 3.2?、分布式緩存(Redis、Memcached等nosql)
????????當本地緩存被穿透的時候就會去查詢分布式緩存,當在分布式緩存中查詢到數據的時候,直接將查詢結果放到本地緩存中。
對于分布式緩存主要是使用NoSQL數據庫來實現,常用的NoSQL數據庫有Redis、Memcached、MongoDB等。目前比較流行的Redis來說,支持Slava/Master模式和Cluster
? ? ? 3.3 、數據庫緩存
????????數據庫在設計的時候也有緩存操作,更改相關參數開啟查詢緩存。如mybatis+mysql的一級、二級緩存
五、常用術語
六、常見問題處理
一、緩存穿透
? ? ? ?問題描述:
? ? ? ?緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷發起請求,如發起為id為“-1”的數據或id為特別大不存在的數據。這時的用戶很可能是攻擊者,攻擊會導致數據庫壓力過大。
? ? ? 解決方案:
???????接口層增加校驗,如用戶鑒權校驗,id做基礎校驗,id<=0的直接攔截;
從緩存取不到的數據,在數據庫中也沒有取到,這時也可以將key-value對寫為key-null,緩存有效時間可以設置短點,如30秒(設置太長會導致正常情況也沒法使用)。這樣可以防止攻擊用戶反復用同一個id暴力攻擊
二、緩存擊穿
? ? ? 問題描述:
? ? ? 緩存擊穿是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由于并發用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力
? ? ? 解決方案:
設置熱點數據永遠不過期。
加互斥鎖,互斥鎖參考代碼如下:
? ? ? ? ? 說明:
? ? ? ? ?1)緩存中有數據,直接走上述代碼13行后就返回結果了
? ? ? ? ?2)緩存中沒有數據,第1個進入的線程,獲取鎖并從數據庫去取數據,沒釋放鎖之前,其他并行進入的線程會等待100ms,再重新去緩存取數據。這樣就防止都去數據庫重復取數據,重復往緩存中更新數據情況出現。
? ? ? ? ? 3)當然這是簡化處理,理論上如果能根據key值加鎖就更好了,就是線程A從數據庫取key1的數據并不妨礙線程B取key2的數據,上面代碼明顯做不到這點。
三、緩存雪崩
? ? ? 描述:
? ? ? 緩存雪崩是指緩存中數據大批量到過期時間,而查詢數據量巨大,引起數據庫壓力過大甚至down機。和緩存擊穿不同的是,緩存擊穿指并發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。
? ? ? 解決方案:
- 緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。
- 如果緩存數據庫是分布式部署,將熱點數據均勻分布在不同的緩存數據庫中。
- 設置熱點數據永遠不過期。
?
總結
以上是生活随笔為你收集整理的java中常用的缓存流程、缓存分类、缓存问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纯css改变下拉列表select框的默认
- 下一篇: bat-bat-bat (重要的事情说