java缓存怎么用_java开发应该如何缓存?
首先應該理解為什么需要緩存。
在計算機的組成中,關于存儲這一塊是分層設計的,訪問速度從快到慢主要分為:CPU的L1緩存、CPU的L2緩存、CPU的L3緩存、主內存、SSD硬盤、機械硬盤。
其實一開始并沒有L1、L2、L3緩存,但CPU訪問內存的速度還是慢,在這個過程中CPU只能等,為了優化這一點,在CPU內部加入了這些緩存,主要用于存放內存中的熱點數據。舉個特例來說,CPU內部的緩存是按緩存行存儲的,64位OS的緩存行通常是64字節,如果當前操作的是一個數組對象的話,CPU不會只讀取一個數組元素到緩存中,而是會讀取多個元素,填充64字節的緩存行,這樣一來,如果遍歷下一個元素的話,就不用跑內存去拿了。
由上可知,計算機的緩存設計是為了盡量消除CPU與各存儲設備的訪問延遲。使數據盡早的觸達CPU。同樣業務開發中,緩存的設計也是為了使數據盡早的觸達用戶。
但是在業務中,還應該根據業務的特點判斷,例如,服務本身沒啥訪問量,而且都是輕量級操作,即使每次都直接操作DB也沒關系,那就沒必要設計緩存,這種情況下設計緩存反而會增加系統復雜度。
另外,如果緩存的數據頻繁變更,也就是寫多讀少的情況,也沒必要設計緩存。
所以,緩存的應用場景可以概括如下:
1)讀多寫少。
2)讀取的數據是需要經過大量計算得出的,這種可以預計算并緩存起來。
另外聊一下題主說的DB緩存、MyBatis緩存、Redis等。
1)DB緩存、MyBatis緩存的設計思路其實跟上面是一致的,目前數據庫的存儲上,主流還是使用機械硬盤,而mysql一類的關系型數據庫通常是隨機讀寫,機械硬盤的一次隨機讀寫尋址時間大概需要10ms,雖然InnoDB引擎的B+數可以有效緩解隨機讀寫次數,但對于高并發系統來說,這個消耗還是很可觀的。再加之每次select操作都需要經過DB的分析器、優化器、執行器、存儲引擎,所以操作是比較復雜的,所以這里緩存的目的就是為了盡可能的降低上述操作帶來的消耗。
另外,MySQL的數據庫緩存,在8版本中已經不支持了,因為每次對于一個row的update操作都會導致緩存失效,update頻繁時,此緩存基本處于無效狀態。在8之前的版本中,DB緩存的使用場景通常是在數據基本不變更的場景下。
2)Redis。其本質是個無中心設計的分布式內存數據庫,基于單進程K-V設計,訪問時間復雜度O(1),通常配合關系型數據庫使用,可當做關系型數據庫的緩存層。這個按需使用即可。
總結
以上是生活随笔為你收集整理的java缓存怎么用_java开发应该如何缓存?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几步即把手机WiFi分享出去-怎么分享手
- 下一篇: 度量矩阵、内积与复矩阵的双线性型的推导