日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中常用的缓存流程、缓存分类、缓存问题

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的一級、二級緩存

五、常用術語

  • 緩存命中:當客戶端請求的數據在緩存中,這個緩存中的數據就會被使用,這一行為被稱為緩存命中
  • 沒有命中:緩存中沒有查詢到數據,并且數據庫中可以查到此數據,并將數據放到緩存中
  • 緩存穿透:是指查詢一個緩存中一定不存在的數據。即緩存中不存在,并且數據庫中也不存在,并且在數據庫中沒有查詢到數據的情況下,不會去寫緩存,這樣就導致每次對于此數據的查詢都會去查詢數據庫,這樣就導致緩存失去了意義。
  • 存儲成本:緩存沒有命中的時候,從其他數據源取出數據并放到緩存中的時間成本和空間成本就是存儲成本。
  • 緩存失效:當緩存中的數據已經更新時,則此數據已經失效
  • 替代策略:當緩存沒有命中的時,并且緩存容量已滿,就需要在緩存中去除一條舊數據,然后加入一條新數據,而應該去除哪些數據,就由替代策略來決定。
  • 常用的替代策略有:LRU、LFU等。在使用緩存算法的時候,通常會考慮使用頻率、獲取成本、緩存容量和時間等因素。
  • 緩存雪崩:緩存中數據大批量到過期時間,而查詢數據量巨大,引起數據庫壓力過大甚至down機。和緩存擊穿不同的是,緩存擊穿指并發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。
  • 緩存擊穿:是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由于并發用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力

  • 六、常見問題處理

    一、緩存穿透

    ? ? ? ?問題描述:

    ? ? ? ?緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷發起請求,如發起為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中常用的缓存流程、缓存分类、缓存问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。