Redis在Java web中的應(yīng)用

一般而言 Redis 在 Java Web 應(yīng)用中存在兩個(gè)主要的場景辅斟,一個(gè)是緩存常用的數(shù)據(jù),另一個(gè)是在需要高速讀/寫的場合使用它快速讀/寫芦拿,比如一些需要進(jìn)行商品搶購和搶紅包的場合士飒。

由于在高并發(fā)的情況下,需要對數(shù)據(jù)進(jìn)行高速讀/寫的場景蔗崎,一個(gè)最為核心的問題是數(shù)據(jù)一致性和訪問控制酵幕。

緩存

在對數(shù)據(jù)庫的讀/寫操作中,現(xiàn)實(shí)的情況是讀操作的次數(shù)遠(yuǎn)超寫操作缓苛,一般是 1:9 到 3:7 的比例芳撒,所以需要讀的可能性是比寫的可能性多得多。

當(dāng)發(fā)送 SQL 去數(shù)據(jù)庫進(jìn)行讀取時(shí)未桥,數(shù)據(jù)庫就會(huì)去磁盤把對應(yīng)的數(shù)據(jù)索引回來笔刹,而索引磁盤是一個(gè)相對緩慢的過程。如果把數(shù)據(jù)直接放在運(yùn)行在內(nèi)存中的 Redis 服務(wù)器上冬耿,那么不需要去讀/寫磁盤了舌菜,而是直接讀取內(nèi)存,顯然速度會(huì)快得多淆党,并且會(huì)極大減輕數(shù)據(jù)庫的壓力酷师。

而使用內(nèi)存進(jìn)行存儲(chǔ)數(shù)據(jù)開銷也是比較大的讶凉,因?yàn)榇疟P可以是 TGB 級(jí)別,而且十分廉價(jià)山孔,內(nèi)存一般是幾百個(gè) GB 就相當(dāng)了不起了懂讯,所以內(nèi)存雖然高效但空間有限,價(jià)格也比磁盤高許多台颠,因此使用內(nèi)存代價(jià)較高褐望,并不是想存什么就存什么,因此我們應(yīng)該考慮有條件的存儲(chǔ)數(shù)據(jù)串前。

一般而言瘫里,存儲(chǔ)一些常用的數(shù)據(jù),比如用戶登錄的信息荡碾;一些主要的業(yè)務(wù)信息谨读,比如銀行會(huì)存儲(chǔ)一些客戶基礎(chǔ)信息、銀行卡信息坛吁、最近交易信息等劳殖。一般而言在使用 Redis 存儲(chǔ)的時(shí)候,需要從 3 個(gè)方面進(jìn)行考慮拨脉。

  1. 業(yè)務(wù)數(shù)據(jù)常用嗎哆姻?命中率如何?如果命中率很低玫膀,就沒有必要寫入緩存矛缨。
  2. 該業(yè)務(wù)數(shù)據(jù)是讀操作多,還是寫操作多帖旨,如果寫操作多箕昭,頻繁需要寫入數(shù)據(jù)庫,也沒有必要使用緩存解阅。
  3. 業(yè)務(wù)數(shù)據(jù)大小如何盟广?如果要存儲(chǔ)幾百兆字節(jié)的文件,會(huì)給緩存帶來很大的壓力瓮钥,有沒有必要?

在考慮過這些問題后烹吵,如果覺得有必要使用緩存碉熄,那么就使用它。使用 Redis 作為緩存的讀取邏輯如圖 1 所示肋拔。


圖1 Redis的緩存應(yīng)用

從圖 1 中可以知道以下兩點(diǎn)锈津。

  • 當(dāng)?shù)谝淮巫x取數(shù)據(jù)的時(shí)候,讀取 Redis 的數(shù)據(jù)就會(huì)失敗凉蜂,此時(shí)會(huì)觸發(fā)程序讀取數(shù)據(jù)庫琼梆,把數(shù)據(jù)讀取出來性誉,并且寫入 Redis。
  • 當(dāng)?shù)诙渭耙院笞x取數(shù)據(jù)時(shí)茎杂,就直接讀取 Redis错览,讀到數(shù)據(jù)后就結(jié)束了流程,這樣速度就大大提高了煌往。

從上面的分析可知倾哺,大部分的操作是讀操作,使用 Redis 應(yīng)對讀操作刽脖,速度就會(huì)十分迅速羞海,同時(shí)也降低了對數(shù)據(jù)庫的依賴,大大降低了數(shù)據(jù)庫的負(fù)擔(dān)曲管。

分析了讀操作的邏輯后却邓,下面再來分析寫操作的流程,如圖 2 所示院水。


圖2 寫操作的流程

從流程可以看出腊徙,更新或者寫入的操作,需要多個(gè) Redis 的操作衙耕。如果業(yè)務(wù)數(shù)據(jù)寫次數(shù)遠(yuǎn)大于讀次數(shù)沒有必要使用 Redis昧穿。如果是讀次數(shù)遠(yuǎn)大于寫次數(shù),則使用 Redis 就有其價(jià)值了橙喘,因?yàn)閷懭?Redis 雖然要消耗一定的代價(jià)时鸵,但是其性能良好,相對數(shù)據(jù)庫而言厅瞎,幾乎可以忽略不計(jì)饰潜。

高速讀、寫場合

在互聯(lián)網(wǎng)的應(yīng)用中和簸,往往存在一些需要高速讀/寫的場合彭雾,比如商品的秒殺,搶紅包锁保,淘寶薯酝、京東的雙十一活動(dòng)或者春運(yùn)搶票等。

以上這類場合在一個(gè)瞬間成千上萬的請求就會(huì)達(dá)到服務(wù)器爽柒,如果使用的是數(shù)據(jù)庫吴菠,一個(gè)瞬間數(shù)據(jù)庫就需要執(zhí)行成千上萬的 SQL,很容易造成數(shù)據(jù)庫的瓶頸浩村,嚴(yán)重的會(huì)導(dǎo)致數(shù)據(jù)庫癱瘓做葵,造成 Java Web 系統(tǒng)服務(wù)崩潰。

在這樣的場合的應(yīng)對辦法往往是考慮異步寫入數(shù)據(jù)庫心墅,而在高速讀/寫的場合中單單使用 Redis 去應(yīng)對酿矢,把這些需要高速讀/寫的數(shù)據(jù)榨乎,緩存到 Redis 中,而在滿足一定的條件下瘫筐,觸發(fā)這些緩存的數(shù)據(jù)寫入數(shù)據(jù)庫中蜜暑。先看看一次請求操作的流程圖,如圖 3 所示严肪。


圖3 Redis在高速讀史煎、寫場合的應(yīng)用

進(jìn)一步論述這個(gè)過程:
當(dāng)一個(gè)請求達(dá)到服務(wù)器,只是把業(yè)務(wù)數(shù)據(jù)先在 Redis 讀/寫驳糯,而沒有進(jìn)行任何對數(shù)據(jù)庫的操作篇梭,換句話說系統(tǒng)僅僅是操作 Redis 緩存,而沒有操作數(shù)據(jù)庫酝枢,這個(gè)速度就比操作數(shù)據(jù)庫要快得多恬偷,從而達(dá)到需要高速響應(yīng)的效果。

但是一般緩存不能持久化帘睦,或者所持久化的數(shù)據(jù)不太規(guī)范袍患,因此需要把這些數(shù)據(jù)存入數(shù)據(jù)庫,所以在一個(gè)請求操作完 Redis 的讀/寫后竣付,會(huì)去判斷該高速讀/寫的業(yè)務(wù)是否結(jié)束诡延。

這個(gè)判斷的條件往往就是秒殺商品剩余個(gè)數(shù)為 0,搶紅包金額為 0古胆,如果不成立肆良,則不會(huì)操作數(shù)據(jù)庫;如果成立逸绎,則觸發(fā)事件將 Redis 緩存的數(shù)據(jù)以批量的形式一次性寫入數(shù)據(jù)庫惹恃,從而完成持久化的工作。

假設(shè)面對的是一個(gè)商品秒殺的場景棺牧,從上面的流程看巫糙,一個(gè)用戶搶購商品,絕大部分的場合都是在操作內(nèi)存數(shù)據(jù)庫 Redis颊乘,而不是磁盤數(shù)據(jù)庫参淹,所以其性能更為優(yōu)越。只有在商品被搶購一空后才會(huì)觸發(fā)系統(tǒng)把 Redis 緩存的數(shù)據(jù)寫入數(shù)據(jù)庫磁盤中乏悄,這樣系統(tǒng)大部分的操作基于內(nèi)存承二,就能夠在秒殺的場合高速響應(yīng)用戶的請求,達(dá)到快速應(yīng)答纲爸。

而現(xiàn)實(shí)中這種需要高速響應(yīng)的系統(tǒng)會(huì)比上面的分析更復(fù)雜,因?yàn)檫@里沒有討論高并發(fā)下的數(shù)據(jù)安全和一致性問題妆够,沒有討論有效請求和無效請求识啦、事務(wù)一致性等諸多問題负蚊,這些將會(huì)在未來以獨(dú)立教程討論它。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颓哮,一起剝皮案震驚了整個(gè)濱河市家妆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冕茅,老刑警劉巖伤极,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異姨伤,居然都是意外死亡哨坪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門乍楚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來当编,“玉大人,你說我怎么就攤上這事徒溪》尥担” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵臊泌,是天一觀的道長鲤桥。 經(jīng)常有香客問我,道長渠概,這世上最難降的妖魔是什么茶凳? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮高氮,結(jié)果婚禮上慧妄,老公的妹妹穿的比我還像新娘。我一直安慰自己剪芍,他們只是感情好塞淹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罪裹,像睡著了一般饱普。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上状共,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天套耕,我揣著相機(jī)與錄音,去河邊找鬼峡继。 笑死冯袍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播康愤,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼儡循,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了征冷?” 一聲冷哼從身側(cè)響起择膝,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎检激,沒想到半個(gè)月后肴捉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叔收,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年齿穗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片今穿。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缤灵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蓝晒,到底是詐尸還是另有隱情腮出,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布芝薇,位于F島的核電站胚嘲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洛二。R本人自食惡果不足惜馋劈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晾嘶。 院中可真熱鬧妓雾,春花似錦、人聲如沸垒迂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽机断。三九已至楷拳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吏奸,已是汗流浹背欢揖。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奋蔚,地道東北人她混。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親产上。 傳聞我的和親對象是個(gè)殘疾皇子棵磷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 緩存是分布式系統(tǒng)中的重要組件,主要解決高并發(fā)晋涣,大數(shù)據(jù)場景下,熱點(diǎn)數(shù)據(jù)訪問的性能問題沉桌。提供高性能的數(shù)據(jù)快速訪問谢鹊。 一...
    Java架構(gòu)師Carl閱讀 1,210評(píng)論 0 23
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常留凭。 O...
    我想起個(gè)好名字閱讀 5,176評(píng)論 0 9
  • Redis 概述 在我們?nèi)粘5腏ava Web開發(fā)中蔼夜,無不都是使用數(shù)據(jù)庫來進(jìn)行數(shù)據(jù)的存儲(chǔ)兼耀,由于一般的系統(tǒng)任務(wù)中通常...
    我沒有三顆心臟閱讀 204,785評(píng)論 35 309
  • --- layout: post title: "如果有人問你關(guān)系型數(shù)據(jù)庫的原理,叫他看這篇文章(轉(zhuǎn))" date...
    藍(lán)墜星閱讀 777評(píng)論 0 3
  • 之一清明節(jié)到了 清明節(jié)到了還獨(dú)自在外面飄游象一朵孤獨(dú)的云無法隨風(fēng)飄向故鄉(xiāng)的墳頭求冷,無法捧上一壺酒瘤运,點(diǎn)三柱香燒幾張紙,...
    閑不語閱讀 228評(píng)論 0 1