本篇內容主要講解“java mq消息隊列的知識點有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java mq消息隊列的知識點有哪些”吧!
我們首先看下這個正常的緩存流程是怎樣的?如下圖所示:
可以看到,首先這個用戶訪問這個某東,然后這個某東去訪問這個 Redis,如果 Redis 有該訪問數據,就會直接返回查緩存拿到的數據;如果 Redis 緩存沒有查到該數據,就會去 MySql 數據庫中查詢,查詢到有結果把從 MySql 中查到的數據同步至 Redis 緩存中去,同時會把這個查詢到的結果返回回去。
這是一個簡單的正常的緩存流程。 那么我們基于這個正常的緩存流程,來看下什么是緩存的雪崩。
首先給大家舉個例子,就是在雙十一的時候,在某東買東西,進入它的這個首頁,由于是雙十一,首頁的訪問量是非常大的,所以首頁的很多數據是緩存在 redis 里面的。
假設首頁數據存儲在 redis 里的 100 個 key,設置的緩存失效時間是兩個小時,當在雙十一期間,購物超過兩個小時之后,這個首頁數據的 redis 緩存在這瞬間會全部失效,導致所有的請求都打到這個 MySql 數據庫上,此時數據庫的訪問壓力增大,造成這個 MySql 數據庫響應不及時而掛掉,從而某東的首頁就沒辦法繼續對外提供服務了,然后東哥就特別不開心,把這次的技術負責人送去了非洲。
那么通過這個舉例,我們來看下面這個圖:
就是說用戶訪問某東,這個時候 redis 里面的 key 大量失效,導致這個某東直接訪問數據庫,把大量的請求都打到來數據庫,這種現象就是緩存雪崩。簡單來說就是 redis 緩存在同一時間大量失效,就像這個雪崩來了一樣。
那么緩存雪崩它的解決方案有幾種呢?下面來說下:
設置這個緩存的失效時間,不讓大量的 key 在同一時間失效,即在設置這個緩存的時候,可以將 key 的失效時間分散開。
我們部署 redis 一般是集群部署的,可以把這些熱點的 key 放到不同的節點上去,讓這些熱點的 key 均勻的分布在不同的 redis 節點上。
還有就是比較暴力的方法,不設置這個緩存失效的時間,讓 key 永不失效。
接下來我們再來介紹什么是緩存穿透。
還是舉個例子:比如說某位老哥開發了一個網站,然后這個網站非常的受歡迎,某一天突然遭到了黑客瘋狂的攻擊,他的這個攻擊手段就是采用這個緩存穿透的原理。
大家都知道通常情況下,數據庫的主鍵是從0開始遞增的,是沒有負數的,那么這位黑客就利用這點,他不斷的用 ID 小于零的參數發請求過來。這位老哥剛開始是把網站的所有數據放到了 redis 緩存里面去,但是黑客是用 ID 小于零的數來請求,redis 緩存里面并沒有這個 ID 小于零的數據,這樣 redis 就查不到這個結果,一旦 redis 查不到結果就會去數據庫中查,那么所有請求都會打到數據庫,而且會一直打到數據庫中去,因為 redis 緩存這層根本攔截不到這樣的數據。
redis 緩存直接被這種數據穿透了,直接穿透到數據庫里面。同樣我們來看下面這個圖:
首先這個惡意用戶訪問某東,用 id=-1 的數據去請求,然后這個 id=-1 的數據在 redis 緩存里面沒有查到,就到數據庫里面查詢,也沒有查到該條數據,只能返回空數據給前端了。
這個惡意用戶(黑客)用腳本不斷的發這個數據去請求,直接穿透 redis 打到這個數據庫上,這就是所謂的緩存穿透。 簡單來說,緩存穿透就是指緩存和數據庫中都沒有這樣的數據,一般出現這種情況都不是正常的用戶在訪問。
那么緩存穿透的解決方案有以下幾點:
請求如果穿透 redis,直接到數據庫,那么數據庫無論查出什么結果,都寫回到 redis 緩存里面去,這樣下次用同一個參數發來請求的時候,就直接被 redis 緩存攔截掉了,就不回打到數據庫了。
對請求的參數做合法性校驗。
比較直接、簡單粗暴的方法,把這個 IP 拉黑。
最后是使用布隆過濾器,這是一個非常好的方式。
我們再來講最后一個問題,就是緩存的擊穿。
還是拿雙十一來舉例:東哥在雙十一的時候,發話說想搞一個大活動,說想把自己20年前用的電腦拿出來拍賣,然后有巨多人對這個電腦感興趣,于是東哥決定在雙十一當天九點拍賣這臺電腦,然后某東的開發程序員,把這臺電腦數據放到了 redis 緩存里,即對應 redis 緩存里的一個 key。
拍賣的時候,大家熱情都非常的高漲,持續拍賣了將近三個小時,還沒有結束這場線上拍賣,但是這臺電腦對應的 redis 緩存 key 的失效時間是三個半小時。 當大家拍賣到三個半小時的時候,這臺電腦的緩存 key 突然失效了,導致這個大量的拍賣請求在 redis 里面查不到數據,從而這些大量請求就會直接打到數據庫上,此時數據庫的瞬間壓力增大,造成響應不及時而掛掉。
這個時候呢,東哥看到自己的這臺電腦還沒拍賣出去,有點生氣,于是把這個程序員送去了非洲。
同樣我們也來看下面這個圖:
用戶訪問某東,然后去 redis 請求某個拍賣秒殺商品,在緩存沒有失效的時候,redis 可以把這個查詢到的緩存 key 的結果返回回去,但是當這個緩存的 key 失效了,這個請求就會擊穿這個 redis,直接打到數據庫上。
這里大家注意的是,這里是某一個熱點的 key,大量的用戶請求不斷的訪問這個熱點的 key,當這個熱點的 key 突然失效,把請求都打到數據庫上,這個過程就是叫做緩存擊穿了。記住它是擊穿某個一個非常熱點的 key。
那么這個緩存擊穿的解決方案是:
讓這個熱點 key 不過期,即不設置失效時間(不推薦)。
使用分布式鎖,如果是單體應用的話使用互斥鎖(分布式鎖后續文章會講)。
到此,相信大家對“java mq消息隊列的知識點有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。