阿里P8亲自讲解!javawhile循环语句用法
前言
作為一個(gè)已經(jīng)畢業(yè)的計(jì)算機(jī)專業(yè)學(xué)長(zhǎng),其實(shí)幾年大學(xué)走來(lái)還是挺感慨萬(wàn)千的。(說(shuō)明一下:一本,非958、211)
老實(shí)說(shuō),上大學(xué)之前填志愿選專業(yè)的時(shí)候沒(méi)有任何打算,就覺(jué)得學(xué)海熬到頭了,向往已久的大學(xué)舒坦日子要來(lái)了,像老一輩人說(shuō)的“飛出籠的鳥(niǎo)”。
最后選的計(jì)算機(jī)專業(yè)也挺喜劇的,因?yàn)閻?ài)打游戲,所以覺(jué)得自己對(duì)計(jì)算機(jī)還挺感興趣的。當(dāng)時(shí)我并不知道之后我會(huì)因?yàn)檫@個(gè)決定而改變我的生活。
緩存雪崩
我們首先看下這個(gè)正常的緩存流程是怎樣的?如下圖所示:
可以看到,首先這個(gè)用戶訪問(wèn)這個(gè)某東,然后這個(gè)某東去訪問(wèn)這個(gè) Redis,如果 Redis 有該訪問(wèn)數(shù)據(jù),就會(huì)直接返回查緩存拿到的數(shù)據(jù);如果 Redis 緩存沒(méi)有查到該數(shù)據(jù),就會(huì)去 MySql 數(shù)據(jù)庫(kù)中查詢,查詢到有結(jié)果把從 MySql 中查到的數(shù)據(jù)同步至 Redis 緩存中去,同時(shí)會(huì)把這個(gè)查詢到的結(jié)果返回回去。
這是一個(gè)簡(jiǎn)單的正常的緩存流程。 那么我們基于這個(gè)正常的緩存流程,來(lái)看下什么是緩存的雪崩。
首先給大家舉個(gè)例子,就是在雙十一的時(shí)候,在某東買東西,進(jìn)入它的這個(gè)首頁(yè),由于是雙十一,首頁(yè)的訪問(wèn)量是非常大的,所以首頁(yè)的很多數(shù)據(jù)是緩存在 redis 里面的。
假設(shè)首頁(yè)數(shù)據(jù)存儲(chǔ)在 redis 里的 100 個(gè) key,設(shè)置的緩存失效時(shí)間是兩個(gè)小時(shí),當(dāng)在雙十一期間,購(gòu)物超過(guò)兩個(gè)小時(shí)之后,這個(gè)首頁(yè)數(shù)據(jù)的 redis 緩存在這瞬間會(huì)全部失效,導(dǎo)致所有的請(qǐng)求都打到這個(gè) MySql 數(shù)據(jù)庫(kù)上,此時(shí)數(shù)據(jù)庫(kù)的訪問(wèn)壓力增大,造成這個(gè) MySql 數(shù)據(jù)庫(kù)響應(yīng)不及時(shí)而掛掉,從而某東的首頁(yè)就沒(méi)辦法繼續(xù)對(duì)外提供服務(wù)了,然后東哥就特別不開(kāi)心,把這次的技術(shù)負(fù)責(zé)人送去了非洲。
那么通過(guò)這個(gè)舉例,我們來(lái)看下面這個(gè)圖:
就是說(shuō)用戶訪問(wèn)某東,這個(gè)時(shí)候 redis 里面的 key 大量失效,導(dǎo)致這個(gè)某東直接訪問(wèn)數(shù)據(jù)庫(kù),把大量的請(qǐng)求都打到來(lái)數(shù)據(jù)庫(kù),這種現(xiàn)象就是緩存雪崩。簡(jiǎn)單來(lái)說(shuō)就是 redis 緩存在同一時(shí)間大量失效,就像這個(gè)雪崩來(lái)了一樣。
那么緩存雪崩它的解決方案有幾種呢?下面來(lái)說(shuō)下:
- 設(shè)置這個(gè)緩存的失效時(shí)間,不讓大量的 key 在同一時(shí)間失效,即在設(shè)置這個(gè)緩存的時(shí)候,可以將 key 的失效時(shí)間分散開(kāi)。
- 我們部署 redis 一般是集群部署的,可以把這些熱點(diǎn)的 key 放到不同的節(jié)點(diǎn)上去,讓這些熱點(diǎn)的 key 均勻的分布在不同的 redis 節(jié)點(diǎn)上。
- 還有就是比較暴力的方法,不設(shè)置這個(gè)緩存失效的時(shí)間,讓 key 永不失效。
緩存穿透
接下來(lái)我們?cè)賮?lái)介紹什么是緩存穿透。
還是舉個(gè)例子:比如說(shuō)某位老哥開(kāi)發(fā)了一個(gè)網(wǎng)站,然后這個(gè)網(wǎng)站非常的受歡迎,某一天突然遭到了黑客瘋狂的攻擊,他的這個(gè)攻擊手段就是采用這個(gè)緩存穿透的原理。
大家都知道通常情況下,數(shù)據(jù)庫(kù)的主鍵是從0開(kāi)始遞增的,是沒(méi)有負(fù)數(shù)的,那么這位黑客就利用這點(diǎn),他不斷的用 ID 小于零的參數(shù)發(fā)請(qǐng)求過(guò)來(lái)。這位老哥剛開(kāi)始是把網(wǎng)站的所有數(shù)據(jù)放到了 redis 緩存里面去,但是黑客是用 ID 小于零的數(shù)來(lái)請(qǐng)求,redis 緩存里面并沒(méi)有這個(gè) ID 小于零的數(shù)據(jù),這樣 redis 就查不到這個(gè)結(jié)果,一旦 redis 查不到結(jié)果就會(huì)去數(shù)據(jù)庫(kù)中查,那么所有請(qǐng)求都會(huì)打到數(shù)據(jù)庫(kù),而且會(huì)一直打到數(shù)據(jù)庫(kù)中去,因?yàn)?redis 緩存這層根本攔截不到這樣的數(shù)據(jù)。
redis 緩存直接被這種數(shù)據(jù)穿透了,直接穿透到數(shù)據(jù)庫(kù)里面。同樣我們來(lái)看下面這個(gè)圖:
首先這個(gè)惡意用戶訪問(wèn)某東,用 id=-1 的數(shù)據(jù)去請(qǐng)求,然后這個(gè) id=-1 的數(shù)據(jù)在 redis 緩存里面沒(méi)有查到,就到數(shù)據(jù)庫(kù)里面查詢,也沒(méi)有查到該條數(shù)據(jù),只能返回空數(shù)據(jù)給前端了。
這個(gè)惡意用戶(黑客)用腳本不斷的發(fā)這個(gè)數(shù)據(jù)去請(qǐng)求,直接穿透 redis 打到這個(gè)數(shù)據(jù)庫(kù)上,這就是所謂的緩存穿透。 簡(jiǎn)單來(lái)說(shuō),緩存穿透就是指緩存和數(shù)據(jù)庫(kù)中都沒(méi)有這樣的數(shù)據(jù),一般出現(xiàn)這種情況都不是正常的用戶在訪問(wèn)。
那么緩存穿透的解決方案有以下幾點(diǎn):
- 請(qǐng)求如果穿透 redis,直接到數(shù)據(jù)庫(kù),那么數(shù)據(jù)庫(kù)無(wú)論查出什么結(jié)果,都寫(xiě)回到 redis 緩存里面去,這樣下次用同一個(gè)參數(shù)發(fā)來(lái)請(qǐng)求的時(shí)候,就直接被 redis 緩存攔截掉了,就不回打到數(shù)據(jù)庫(kù)了。
- 對(duì)請(qǐng)求的參數(shù)做合法性校驗(yàn)。
- 比較直接、簡(jiǎn)單粗暴的方法,把這個(gè) IP 拉黑。
- 最后是使用布隆過(guò)濾器,這是一個(gè)非常好的方式。
緩存擊穿
我們?cè)賮?lái)講最后一個(gè)問(wèn)題,就是緩存的擊穿。
還是拿雙十一來(lái)舉例:東哥在雙十一的時(shí)候,發(fā)話說(shuō)想搞一個(gè)大活動(dòng),說(shuō)想把自己20年前用的電腦拿出來(lái)拍賣,然后有巨多人對(duì)這個(gè)電腦感興趣,于是東哥決定在雙十一當(dāng)天九點(diǎn)拍賣這臺(tái)電腦,然后某東的開(kāi)發(fā)程序員,把這臺(tái)電腦數(shù)據(jù)放到了 redis 緩存里,即對(duì)應(yīng) redis 緩存里的一個(gè) key。
拍賣的時(shí)候,大家熱情都非常的高漲,持續(xù)拍賣了將近三個(gè)小時(shí),還沒(méi)有結(jié)束這場(chǎng)線上拍賣,但是這臺(tái)電腦對(duì)應(yīng)的 redis 緩存 key 的失效時(shí)間是三個(gè)半小時(shí)。 當(dāng)大家拍賣到三個(gè)半小時(shí)的時(shí)候,這臺(tái)電腦的緩存 key 突然失效了,導(dǎo)致這個(gè)大量的拍賣請(qǐng)求在 redis 里面查不到數(shù)據(jù),從而這些大量請(qǐng)求就會(huì)直接打到數(shù)據(jù)庫(kù)上,此時(shí)數(shù)據(jù)庫(kù)的瞬間壓力增大,造成響應(yīng)不及時(shí)而掛掉。
這個(gè)時(shí)候呢,東哥看到自己的這臺(tái)電腦還沒(méi)拍賣出去,有點(diǎn)生氣,于是把這個(gè)程序員送去了非洲。
同樣我們也來(lái)看下面這個(gè)圖:
用戶訪問(wèn)某東,然后去 redis 請(qǐng)求某個(gè)拍賣秒殺商品,在緩存沒(méi)有失效的時(shí)候,redis 可以把這個(gè)查詢到的緩存 key 的結(jié)果返回回去,但是當(dāng)這個(gè)緩存的 key 失效了,這個(gè)請(qǐng)求就會(huì)擊穿這個(gè) redis,直接打到數(shù)據(jù)庫(kù)上。
這里大家注意的是,這里是某一個(gè)熱點(diǎn)的 key,大量的用戶請(qǐng)求不斷的訪問(wèn)這個(gè)熱點(diǎn)的 key,當(dāng)這個(gè)熱點(diǎn)的 key 突然失效,把請(qǐng)求都打到數(shù)據(jù)庫(kù)上,這個(gè)過(guò)程就是叫做緩存擊穿了。記住它是擊穿某個(gè)一個(gè)非常熱點(diǎn)的 key。
那么這個(gè)緩存擊穿的解決方案是:
- 讓這個(gè)熱點(diǎn) key 不過(guò)期,即不設(shè)置失效時(shí)間(不推薦)。
- 使用分布式鎖,如果是單體應(yīng)用的話使用互斥鎖(分布式鎖后續(xù)文章會(huì)講)。
最后
經(jīng)過(guò)日積月累, 以下是小編歸納整理的深入了解Java虛擬機(jī)文檔,希望可以幫助大家過(guò)關(guān)斬將順利通過(guò)面試。
由于整個(gè)文檔比較全面,內(nèi)容比較多,篇幅不允許,下面以截圖方式展示 。如有需要獲取資料文檔的朋友,可以點(diǎn)擊這里免費(fèi)獲取
5221)]
[外鏈圖片轉(zhuǎn)存中…(img-YoWUK1d6-1622525515222)]
[外鏈圖片轉(zhuǎn)存中…(img-qXCcvmI6-1622525515222)]
由于篇幅限制,文檔的詳解資料太全面,細(xì)節(jié)內(nèi)容太多,所以只把部分知識(shí)點(diǎn)截圖出來(lái)粗略的介紹,每個(gè)小節(jié)點(diǎn)里面都有更細(xì)化的內(nèi)容!
總結(jié)
以上是生活随笔為你收集整理的阿里P8亲自讲解!javawhile循环语句用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 女人劫剧情介绍
- 下一篇: 阿里P8亲自讲解!java中级开发工程师