降低Redis內(nèi)存使用和提升性能的一些方案

前言

一站欺、前言

Redis在現(xiàn)在開發(fā)中已經(jīng)成為了一個不可或缺的組件姨夹,很多項目都會依賴Redis進行開發(fā),當數(shù)據(jù)量和請求量以及Redis本身訪問率不高的情況下矾策,Redis不會成為性能瓶頸磷账,但是如果本身處于高并發(fā)海量數(shù)據(jù)這些情況下,即便是Redis贾虽,也會成為性能瓶頸中的一環(huán)逃糟,本文就是基于Redis已經(jīng)成為我項目中的一個性能瓶頸之后,深入研究后產(chǎn)生的,另外本文主要是針對開發(fā)過程中如何降低Redis內(nèi)存使用率以及整體提升代碼性能绰咽,不涉及到Redis集群搭建相關(guān)性能調(diào)優(yōu)

二菇肃、降低內(nèi)存占用

a)減少key長度

首先key本身也是存在redis內(nèi)存中的,每條數(shù)據(jù)增加2個字節(jié)的長度取募,成百上千萬數(shù)據(jù)加起來琐谤,就占用了不少的內(nèi)存了,所以需要盡可能的縮減key的長度玩敏,能保證key唯一性就好斗忌,沒有必要把一些前綴設(shè)置很長或者使用英文全稱

b)合理的緩存有效期

讓緩存在不被使用時盡快過期,避免占用內(nèi)存旺聚,如果有大量緩存在業(yè)務(wù)中不會被使用织阳,或者緩存從生效到不被使用只有1小時,但是緩存有效期卻設(shè)置的1天砰粹,那么就會導致大量無用緩存占用大量內(nèi)存唧躲,所以一定要合理評估每一個緩存的生命周期。當內(nèi)存資源明顯緊張超過CPU等資源時碱璃,可以采取主動刪除明確不使用的緩存惊窖,或者針對熱點周期進行緩存生命周期配置,并配置好合理的恢復緩存機制

示例:

1.主動刪除緩存

假如有以下場景:某商城厘贼,下單訂單時需要先預覽訂單,并且生成訂單邏輯復雜圣拄,且訂單量大嘴秸,所以預覽訂單時會先生成訂單緩存,創(chuàng)建訂單后庇谆,因為某些業(yè)務(wù)還需要快速訪問訂單岳掐,如發(fā)起支付時獲取金額信息以及驗證等,并且支付有效期有1天饭耳,也就是如果沒有支付串述,一天內(nèi)發(fā)起支付的可能性較大,需要快速獲取相關(guān)信息寞肖。 如果用固定有效期1天的話纲酗,那么其實在訂單支付之后,訪問訂單詳情概率變很低新蟆,也就是說一旦訂單支付完成觅赊,訂單詳情基本上不訪問,那么就可以采取主動刪除緩存的方式琼稻。首先創(chuàng)建緩存的時候吮螺,設(shè)置緩存有效期是1天,同時訂單真正創(chuàng)建時候時候,更新緩存為1天(支付有效期1天)鸠补,在訂單被支付之后萝风,則主動刪除緩存(如果還有跳轉(zhuǎn)頁面并且需要通過緩存獲取訂單詳情的,則設(shè)置一個接口完全可以獲取到時間)紫岩。這樣如果訂單沒有支付规惰,那么一天內(nèi)還是可以快速訪問到這個訂單的緩存信息,如果被支付被因,因為基本上不訪問了卿拴,緩存也能盡快過期避免占用內(nèi)存

2.熱點周期模式

假設(shè)還是上面商城,場景稍作變換梨与,訂單支付完成之后堕花,其實很多人會很習慣的關(guān)注訂單進度(會查看訂單詳情),但是有些人其實不關(guān)心粥鞋,買完就不管缘挽,而查看的正常來說每天會關(guān)注幾次,知道收貨之后呻粹,那我們可以模擬TTI的方式(Redis本質(zhì)上是沒有TTI的)壕曼,在我們每次通過Redis獲取到緩存之后,重新設(shè)置緩存有效期為1天等浊,這樣可以讓熱點數(shù)據(jù)一直處于相對有效腮郊,當沒有獲取到數(shù)據(jù)時,就從數(shù)據(jù)庫等其他地方查詢并緩存

c)合理的結(jié)構(gòu)

存放在Redis的數(shù)據(jù)結(jié)構(gòu)盡可能縮減筹燕,避免無用字段進入緩存轧飞,比如常見的直接用數(shù)據(jù)庫對應(yīng)實體類對象直接存放到Redis,導致很多無用字段也進行了緩存撒踪,如一些樂觀鎖过咬、創(chuàng)建時間等字段,精簡緩存到滿足業(yè)務(wù)需求即可制妄。盡可能保證每個字段都是業(yè)務(wù)能用上的

d)合理的序列化

業(yè)務(wù)中常見的是把對象緩存到Redis中掸绞,而緩存對象,就會涉及到序列化耕捞,常見的序列化方式有json衔掸、默認序列化、kryo等砸脊,選擇合適的序列化不僅能提升程序運行速度具篇,還能降低內(nèi)存占用,當然不同的結(jié)構(gòu)也會影響不同的序列化對于內(nèi)存占用的影響比例凌埂,所以具體選擇那種序列化也需要根據(jù)自己實際情況做選擇驱显,但是通常情況下,加入對象中有10個字段,那么大概率內(nèi)存占用是Java默認序列化 > json > kryo埃疫,但是不同的序列化也會產(chǎn)生很多其他問題伏恐,比如可讀性和通用性,如果這個Redis緩存并不只是一種語言的程序會訪問栓霜,那么就要考慮采用多種語言都能序列化的方式了

e)數(shù)據(jù)壓縮

很多緩存數(shù)據(jù)可能本身只是一個字符串翠桦,或者因為通用性問題最終選擇了json格式的序列化,那么也可以通過壓縮來降低內(nèi)存占用胳蛮,但是目前redis本身是不支持壓縮的销凑,所以只能是在客戶端進行壓縮和解壓操作,但是壓縮和解壓會帶來額外的CPU消耗

三仅炊、提升性能

a)選擇合適的客戶端

常見的有Jedis斗幼、Lettuce(現(xiàn)在Spring的默認客戶端)、Redisson抚垄,每個客戶端都有自己的優(yōu)劣蜕窿,可以根據(jù)實際情況進行選擇

b)合適的序列化

不同序列化方式也是有差異的,雖然差異很小呆馁,但是如果是海量操作桐经,哪怕很小的差異,也是能提升不小的時間成本的浙滤,但是序列化也會影響內(nèi)存占用阴挣,并且如果訪問量很大的情況下,通常緩存的key也不會小纺腊,所以要在內(nèi)存和性能中做平衡屯吊,但是相對來說,序列化本身是在客戶端實現(xiàn)的摹菠,而客戶端的CPU資源相對來說更容易擴展,所以大部分情況下序列化還是考慮內(nèi)存占用為主

c)合理的壓縮和縮減數(shù)據(jù)

首選Redis是以服務(wù)形式存在的骗爆,并且正常來說Redis是會有專門的服務(wù)器次氨,所以如果訪問量很大,并且數(shù)據(jù)本身也不少的話摘投,網(wǎng)絡(luò)IO也會成為性能瓶頸的一環(huán)煮寡,所以如果保存的內(nèi)容越小,傳輸也會更快犀呼,更不容易造成網(wǎng)絡(luò)阻塞

d)批量操作

批量操作包括批量保存和批量獲取以及一些其他條件性的保存等幸撕,如果業(yè)務(wù)可以通過批量操作的方式來實現(xiàn),盡可能使用批量操作外臂,首先批量保存和獲取是常用客戶端已經(jīng)支持的操作坐儿,同時如果是一些原子性的操作或者有條件判斷的,可以利用lua腳本來實現(xiàn),目前常用的客戶端也是支持lua腳本的操作的貌矿,比如常見的判斷某個key1是否存在炭菌,如果存在則保存key2的數(shù)據(jù),如果不存在則刪除key1的數(shù)據(jù)這些都可以通過lua腳本實現(xiàn)逛漫,這樣不僅降低了網(wǎng)絡(luò)占用黑低,同時還能保證當前不會有并發(fā)問題,比如判斷key1的時候酌毡,key1的確不存在克握,但是當你寫入key2的時候,key1卻存在了枷踏,但是使用lua腳本就不會有這種問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菩暗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呕寝,更是在濱河造成了極大的恐慌勋眯,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件下梢,死亡現(xiàn)場離奇詭異客蹋,居然都是意外死亡,警方通過查閱死者的電腦和手機孽江,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門讶坯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岗屏,你說我怎么就攤上這事辆琅。” “怎么了这刷?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵婉烟,是天一觀的道長。 經(jīng)常有香客問我暇屋,道長似袁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任咐刨,我火速辦了婚禮昙衅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘定鸟。我一直安慰自己而涉,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布联予。 她就那樣靜靜地躺著啼县,像睡著了一般材原。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谭羔,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天华糖,我揣著相機與錄音,去河邊找鬼瘟裸。 笑死客叉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的话告。 我是一名探鬼主播兼搏,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沙郭!你這毒婦竟也來了佛呻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤病线,失蹤者是張志新(化名)和其女友劉穎吓著,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體送挑,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡绑莺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惕耕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纺裁。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖司澎,靈堂內(nèi)的尸體忽然破棺而出欺缘,到底是詐尸還是另有隱情,我是刑警寧澤挤安,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布谚殊,位于F島的核電站,受9級特大地震影響蛤铜,放射性物質(zhì)發(fā)生泄漏络凿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一昂羡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摔踱,春花似錦虐先、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撰洗。三九已至,卻和暖如春腐芍,著一層夾襖步出監(jiān)牢的瞬間差导,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工猪勇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留设褐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓泣刹,卻偏偏與公主長得像助析,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子椅您,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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