亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java緩存設計要考慮哪些問題

發布時間:2022-01-17 10:11:02 來源:億速云 閱讀:168 作者:iii 欄目:軟件技術

本篇內容主要講解“Java緩存設計要考慮哪些問題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java緩存設計要考慮哪些問題”吧!

  緩存穿透

  緩存穿透是指查詢一個一定不存在的數據,因為這個數據不存在,所以永遠不會被緩存,所以每次請求都會去請求數據庫。

  例如我們請求一個 UserID 為 -1 的用戶數據,因為該用戶不存在,所以該請求每次都會去讀取數據庫。在這種情況下,如果某些心懷不軌的人利用這個存在的漏洞去偽造大量的請求,那么很可能導致DB承受不了那么大的流量就掛掉了。

  對于緩存穿透,有幾種解決方案,一種是事前預防,一種是事后預防。

  事前預防。其實就是對所有請求都進行參數校驗,把絕大多數非法的請求抵擋在最外層。在我們舉的這個例子中,那么就是做參數校驗,對于 UserID 小于 0 的請求全部拒絕。但即使我們做了全面的參數校驗,還是可能存在漏網之魚,會出現一些我們沒想到的情況。

  例如我們的 UserID 是遞增的,那么如果有人請求一個 UserID 很大的用戶信息(例如:1000000),而我們的 UserID 最大也就 10000。這個時候,你不可能限制 UserID 大于 1 萬的就是非法的,或者說大于 10 萬就是非法的,所以該用戶ID肯定可以通過參數校驗。但該用戶確實不存在,所以每次請求都會去請求數據庫。

  其實上面只是我所能想到的一種情況,我們沒想到的情況肯定還有很多。對于這些情況,我們能做的就是時候預防。

  事后預防。事后預防說的就是當查詢到一個空的結果時,我們仍然將這個空的結果進行緩存,但是設置一個很短的過期時間(例如一分鐘)。在這里我們可以看到,其實我們并沒有完全預防非法請求,只不過是將非法請求的風險讓承受能力更強的redis去承擔,讓承受能力稍弱的數據庫更安全。

  通過上面這兩種處理方式,我們基本可以解決緩存穿透的問題。事前預防解決80%的非法請求,剩下的20%非法請求則使用Redis轉移風險。

  緩存擊穿

  如果你的應用中有一些訪問量很高的熱點數據,我們一般會將其放在緩存中以提高訪問速度。另外,為了保持時效性,我們通常還會設置一個過期時間。但是對于這些訪問量很高的KEY,我們需要考慮一個問題:當熱點KEY在失效的瞬間,海量的請求會不會產生大量的數據庫請求,從而導致數據庫崩潰?

  例如我們有一個業務 KEY,該 KEY 的并發請求量為 10000。當該 KEY 失效的時候,就會有 1 萬個線程會去請求數據庫更新緩存。這個時候如果沒有采取適當的措施,那么數據庫很可能崩潰。

  其實上面這個問題就是緩存擊穿的問題,它發生在緩存KEY的過期瞬間。對于這種情況,現在常用的解決方式有這么兩種:互斥鎖、永遠不過期。

  互斥鎖

  互斥鎖指的是在緩存KEY過期去更新的時候,先讓程序去獲取鎖,只有獲取到鎖的線程才有資格去更新緩存KEY。其他沒有獲取到鎖的線程則休眠片刻之后再次去獲取最新的緩存數據。通過這種方式,同一時刻永遠只有一個線程會去讀取數據庫,這樣也就避免了海量數據庫請求對于數據庫的沖擊。

  而對于上面說到的鎖,我們可以使用緩存提供的一些原則操作來完成。例如對于 redis 緩存來說,我們可以使用其 SETNX 命令來完成。

Java緩存設計要考慮哪些問題

  上面的 key_mutex 其實就是一個普通的 KEY-VALUE 值,我們使用 setnx 命令去設置其值為 1。如果這時候已經有人在更新緩存KEY了,那么 setnx 命令會返回 0,表示設置失敗。

  永遠不過期

  從緩存的角度來看,如果你設置了永遠不過期,那么就不會有海量請求數據庫的情形出現。此時我們一般通過新起一個線程的方式去定時將數據庫中的數據更新到緩存中,更加成熟的方式是通過定時任務去同步緩存和數據庫的數據。

  但這種方案會出現數據的延遲問題,也就是線程讀取到的數據并不是最新的數據。但對于一般的互聯網功能來說,些許的延遲還是能接受的。

  緩存雪崩

  緩存雪崩是指在我們設置緩存時采用了相同的過期時間,導致緩存在某一時刻同時失效,請求全部轉發到數據庫,最終導致數據庫瞬時壓力過大而崩潰。

  例如我們有 1000 個KEY,而每個 KEY 的并發請求不大,只有 10 次。而緩存雪崩指的就是這 1000 個 KEY 在同一時間,同時失效,這個時候就突然有 1000 ** 10 = 一萬次查詢。

  緩存雪崩導致的問題一般很難排查,如果沒有事先預防,很可能要花很大力氣才能找得到原因。對于緩存雪崩的情況,最簡單的方案就是在原有失效時間的基礎上增加一個隨機時間(例如1-5分鐘),這樣每個緩存過期時間的重復率就會降低,從而減少緩存雪崩的發生。

  「緩存穿透」指的是請求不存在的數據,從而使得緩存形同虛設,緩存層被穿透了。例如我們請求一個 UserID 為 -1 的用戶數據,因為該用戶不存在,所以該請求每次都會去讀取數據庫。在這種情況下,如果某些心懷不軌的人利用這個存在的漏洞去偽造大量的請求,那么很可能導致DB承受不了那么大的流量就掛掉了。

  「緩存擊穿」指的是并發量很高的 KEY,在該 KEY 失效的瞬間有很多請求同同時去請求數據庫,更新緩存。例如我們有一個業務 KEY,該 KEY 的并發請求量為 10000。當該 KEY 失效的時候,就會有 1 萬個線程會去請求數據庫更新緩存。這個時候如果沒有采取適當的措施,那么數據庫很可能崩潰。

  「緩存雪崩」則是指緩存在同一時間同時過期,就像所有雪塊同一時刻掉下來,像雪崩一樣。例如我們有 1000 個KEY,而每個 KEY 的并發請求不大,只有 10 次。而緩存雪崩指的就是這 1000 個 KEY 在同一時間,同時失效,這個時候就突然有 1000 ** 10 = 一萬次查詢。

  對于它們出現的情形,我們可以做一些總結:

  「緩存穿透」是業務層面的漏洞導致非法請求,與請求量、緩存失效沒關系。「緩存擊穿」則只會出現在熱點數據上,發生在緩存失效的瞬間,與業務沒多大關系。「緩存雪崩」則是因為多個 KEY 同時失效,導致數據庫請求太多。非熱點數據也會導致緩存雪崩,只要同時失效的 KEY 足夠多。

到此,相信大家對“Java緩存設計要考慮哪些問題”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

枝江市| 丹棱县| 稷山县| 米林县| 龙州县| 渭源县| 绥棱县| 珲春市| 赤壁市| 海丰县| 黄石市| 东港市| 涿鹿县| 绿春县| 顺昌县| 沙田区| 萨迦县| 隆回县| 和林格尔县| 丹巴县| 南丰县| 吉木乃县| 乐清市| 科技| 许昌市| 泸西县| 陈巴尔虎旗| 湖南省| 武山县| 霍州市| 胶南市| 吉木萨尔县| 莲花县| 启东市| 高青县| 石狮市| 松江区| 芜湖县| 镇江市| 公主岭市| 永康市|