Redis學(xué)習(xí)筆記——進(jìn)階篇

一蹦锋、Redis實(shí)現(xiàn)緩存

1.緩存實(shí)現(xiàn)方式

使用Redis做緩存有兩種方式:直接通過(guò)RedisTemplate來(lái)使用、使用spring cache集成Redis

RedisTemplate

Spring Cache集成Redis

2.數(shù)據(jù)淘汰機(jī)制

前置知識(shí)點(diǎn):key的生存時(shí)間和過(guò)期時(shí)間

volatile-lru 從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰
volatile-ttl 從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中挑選將要過(guò)期的數(shù)據(jù)淘汰
volatile-random從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰
allkeys-lru從所有數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰
allkeys-random從所有數(shù)據(jù)集中任意選擇數(shù)據(jù)進(jìn)行淘汰
noeviction禁止驅(qū)逐數(shù)據(jù)

Redis中的淘汰機(jī)制(LRU和TTL)都是非精確算法實(shí)現(xiàn)的璧眠,主要從性能和可靠性上做平衡,所以并不是完全可靠,在了解Redis淘汰策略之后還應(yīng)在平時(shí)多主動(dòng)設(shè)置或更新key的expire時(shí)間蝌借,主動(dòng)刪除沒(méi)有價(jià)值的數(shù)據(jù),提升Redis整體性能和空間

二指蚁、緩存相關(guān)問(wèn)題的預(yù)防和解決

1.緩存穿透

緩存穿透是指查詢一個(gè)一不存在的數(shù)據(jù)菩佑,從緩存redis沒(méi)有命中,需要從mysql數(shù)據(jù)庫(kù)查詢欣舵,查不到數(shù)據(jù)則不寫(xiě)入緩存擎鸠,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到數(shù)據(jù)庫(kù)去查詢,造成緩存穿透缘圈。

解決辦法:
1.接口層增加校驗(yàn)劣光,對(duì)傳參進(jìn)行校驗(yàn)袜蚕,給key設(shè)置一些格式規(guī)則,濾掉不符合規(guī)則的Key绢涡;
2.緩存空值:如果查詢數(shù)據(jù)庫(kù)也為空牲剃,直接設(shè)置空值存放到緩存,這樣第二次到緩沖中獲取就有值了雄可,而不會(huì)繼續(xù)訪問(wèn)數(shù)據(jù)庫(kù)凿傅。設(shè)置一個(gè)過(guò)期時(shí)間或者當(dāng)有值的時(shí)候?qū)⒕彺嬷械闹堤鎿Q掉即可。
3.BloomFilter(Redis-避免緩存穿透的利器之BloomFilter

2.緩存擊穿

本應(yīng)該在緩存中的熱點(diǎn)數(shù)據(jù)突然失效数苫,大量請(qǐng)求打到服務(wù)器的數(shù)據(jù)庫(kù)中聪舒。

解決辦法:
1.設(shè)置數(shù)據(jù)永不過(guò)期
2.加互斥鎖

3.緩存雪崩

數(shù)據(jù)未加載到緩存中,或者緩存同一時(shí)間大面積的失效虐急,從而導(dǎo)致所有請(qǐng)求都去查數(shù)據(jù)庫(kù)箱残,CPU和內(nèi)存負(fù)載過(guò)高,甚至宕機(jī)止吁。

預(yù)防措施:
1.使用集群緩存被辑。降低宕機(jī)概率。
2.在每一個(gè)緩存原有的過(guò)期時(shí)間基礎(chǔ)上加一個(gè)隨機(jī)值敬惦,比如1到5分鐘盼理,這樣每一個(gè)緩存的過(guò)期時(shí)間的重復(fù)率就會(huì)降低,就很難引發(fā)集體失效的事件俄删。
3.加阻塞隊(duì)列宏怔,每次只有一個(gè)線程在執(zhí)行請(qǐng)求,缺點(diǎn)也顯而易見(jiàn)畴椰,會(huì)降低系統(tǒng)QPS举哟。

消減措施:
1.二級(jí)緩存
2.降級(jí)+接口限速

三、Redis分布式鎖——SETNX

SETNX是redis的一個(gè)命令迅矛,對(duì)應(yīng)的操作是將 key 的值設(shè)為 value妨猩,當(dāng)且僅當(dāng) key 不存在。若給定的 key 已經(jīng)存在秽褒,則 SETNX 不做任何動(dòng)作壶硅。
命令格式:

SETNX key value

返回整數(shù),具體為

  • 1销斟,當(dāng) key 的值被設(shè)置
  • 0庐椒,當(dāng) key 的值沒(méi)被設(shè)置

使用 set key value [EX seconds][PX milliseconds][NX|XX] 命令實(shí)現(xiàn)分布式鎖
Redis在 2.6.12 版本開(kāi)始,為 SET 命令增加一系列選項(xiàng):

SET key value[EX seconds][PX milliseconds][NX|XX]

  • EX seconds: 設(shè)定過(guò)期時(shí)間蚂踊,單位為秒
  • PX milliseconds: 設(shè)定過(guò)期時(shí)間约谈,單位為毫秒
  • NX: 僅當(dāng)key不存在時(shí)設(shè)置值
  • XX: 僅當(dāng)key存在時(shí)設(shè)置值

設(shè)置過(guò)期時(shí)間(避免獲取到鎖的客戶端意外死掉鎖得不到釋放)
value設(shè)置為隨機(jī)值,釋放鎖之前判斷鎖對(duì)應(yīng)的value是不是自己設(shè)置的,如果是才去釋放(避免錯(cuò)誤釋放別人設(shè)置的鎖)

詳細(xì)內(nèi)容參考這篇博客:基于Redis的分布式鎖實(shí)現(xiàn)

四棱诱、Redis數(shù)據(jù)類型底層實(shí)現(xiàn)

再來(lái)說(shuō)一說(shuō)Redis支持的幾種數(shù)據(jù)類型的底層實(shí)現(xiàn)泼橘。

1.string-SDS

Redis是用C語(yǔ)言實(shí)現(xiàn)的,C語(yǔ)言中迈勋,字符串其實(shí)就是一個(gè)數(shù)組炬灭,但是Redis的字符串底層實(shí)現(xiàn)是SDS,動(dòng)態(tài)字符串靡菇,結(jié)構(gòu)如下:


SDS

將字符串長(zhǎng)度保存到len字段重归,這樣獲取長(zhǎng)度就不用想C語(yǔ)言的字符串去遍歷一遍。
此外厦凤,SDS還有如下兩個(gè)特點(diǎn):
1.減少修改字符串時(shí)帶來(lái)的內(nèi)存重分配次數(shù)
free表示還沒(méi)有使用的空間鼻吮,用來(lái)做空間預(yù)分配和惰性空間釋放。
2.二進(jìn)制安全
字符串是否結(jié)束不是去判斷空字符也就是'\0'较鼓,而是判斷l(xiāng)en狈网,這樣也保證了SDS的二進(jìn)制安全,讓其可以存圖片笨腥、音頻等文件。

2.zset-跳躍表

請(qǐng)參考Redis為什么用跳表而不用平衡樹(shù)勇垛?

推薦文集:
Redis系列文章——合集

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脖母,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闲孤,更是在濱河造成了極大的恐慌谆级,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讼积,死亡現(xiàn)場(chǎng)離奇詭異肥照,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)勤众,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)舆绎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人们颜,你說(shuō)我怎么就攤上這事吕朵。” “怎么了窥突?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵努溃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我阻问,道長(zhǎng)梧税,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮第队,結(jié)果婚禮上哮塞,老公的妹妹穿的比我還像新娘。我一直安慰自己斥铺,他們只是感情好彻桃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著晾蜘,像睡著了一般邻眷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剔交,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天肆饶,我揣著相機(jī)與錄音,去河邊找鬼岖常。 笑死驯镊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竭鞍。 我是一名探鬼主播板惑,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼偎快!你這毒婦竟也來(lái)了冯乘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晒夹,失蹤者是張志新(化名)和其女友劉穎裆馒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體丐怯,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喷好,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了读跷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梗搅。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖效览,靈堂內(nèi)的尸體忽然破棺而出些膨,到底是詐尸還是另有隱情,我是刑警寧澤钦铺,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布订雾,位于F島的核電站,受9級(jí)特大地震影響矛洞,放射性物質(zhì)發(fā)生泄漏洼哎。R本人自食惡果不足惜烫映,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望噩峦。 院中可真熱鬧锭沟,春花似錦、人聲如沸识补。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凭涂。三九已至祝辣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間切油,已是汗流浹背蝙斜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澎胡,地道東北人孕荠。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像攻谁,于是被迫代替她去往敵國(guó)和親稚伍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353