那些年俩垃,常被問到懵逼Redis面試題,一文吊打面試官(含答案)

Redis是一個非程ⅲ火熱的一個“專有詞”在互聯(lián)網(wǎng)和大數(shù)據(jù)中占有一席之位口柳。Redis是一款高性能的NOSQL系列的非關系型數(shù)據(jù)庫,也是之所以為何這么火的原因了吧有滑!下面是小編為大家總結的一些關于Redis的面試題(個人總結)希望大家會喜歡跃闹。

Redis的基礎

什么是Redis ?簡述它的優(yōu)缺點:Redis的全稱是Remote DictionarylServer ,本質(zhì)上是一個Key-Value類型的內(nèi)存數(shù)據(jù)庫,很像memcached ,整個數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內(nèi)存當中進行操作,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù)flush到硬盤上進行保存。Redis的主要缺點是數(shù)據(jù)庫容量受到物理內(nèi)存的限制毛好,不能用作海量數(shù)據(jù)的高性能讀寫,因此Redis適合的場景主要局限在較小數(shù)據(jù)量的高性能操作和運算上辣卒。

為什么Redis需要把所有數(shù)據(jù)放到內(nèi)存中:Redis為了達到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。所以redis具有快速和數(shù)據(jù)持久化的特征睛榄,如果不將數(shù)據(jù)放在內(nèi)存中,磁盤I/O速度為嚴重影響redis的性能。在內(nèi)存越來越便宜的今天, redis將會越來越受歡迎想帅,如果設置了最大使用的內(nèi)存,則數(shù)據(jù)已有記錄數(shù)達到內(nèi)存限值后不能繼續(xù)插入新值场靴。

Redis和Redisson有什么關系:Redisson是-個高級的分布式協(xié)調(diào)Redis客服端,能幫助用戶在分布式環(huán)境中輕松實現(xiàn)一些Java的對象(Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap,List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock,ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。

Jedis與Redisson對比有什么優(yōu)缺點:Jedis是Redis的Java實現(xiàn)的客戶端港准,其API提供了比較全面的Redis命令的支持;Redisson實現(xiàn)了分布式和可擴展的Java數(shù)據(jù)結構,和Jedis相比旨剥,功能較為簡單,不支持字符串操作,不支持排序浅缸、事務轨帜、管道、分區(qū)等Redis特性衩椒。Redisson 的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務邏輯上蚌父。

Redis的緩存穿透、緩存崩潰毛萌、緩存擊穿的理解苟弛?

1.緩存穿透:是指查詢一個數(shù)據(jù)庫一定不存在的數(shù)據(jù)。

正常的使用緩存流程大致是阁将,數(shù)據(jù)查詢先進行緩存查詢膏秫,如果key不存在或 者key已經(jīng)過期,再對數(shù)據(jù)庫進行查詢做盅,并把查詢到的對象缤削,放進緩存窘哈。如果數(shù)據(jù)庫查詢對象為空,則不放進緩存亭敢。

發(fā)生場景:

如果傳入的參數(shù)為-1滚婉,會是怎么樣?這個-1吨拗,就是一定不存在的對象满哪。就會每次都去查詢數(shù)據(jù)庫,而每次查詢都是空劝篷,每次又都不會進行緩存哨鸭。假如有惡意攻擊,就可以利用這個漏洞娇妓,對數(shù)據(jù)庫造成壓力像鸡,甚至壓垮數(shù)據(jù)庫。即便是采用UUID哈恰,也是很容易找到一個不存在的KEY只估,進行攻擊。

2.緩存擊穿: 是指一個key非常熱點着绷,在不停的扛著大并發(fā)蛔钙,大并發(fā)集中對這一個點進行訪問,當這個key在失效的瞬間荠医,持續(xù)的大并發(fā)就穿破緩存吁脱,直接請求數(shù)據(jù)庫,就像在一個屏障上鑿開了一個洞彬向。

發(fā)生場景:某一個商品爆款的時候會導致這種情況的產(chǎn)生兼贡。解決方案:

設置緩存永不過期(或者過期時間比較大)。

設置雙重緩存?zhèn)浞軦和B娃胆,當A緩存失效時遍希,使用B緩存。

3.緩存雪崩:緩存在同一時間內(nèi)大量鍵過期(失效)里烦,接著來的一大波請求瞬間都落在了數(shù)據(jù)庫中導致連接異常凿蒜。

解決方案:

也是像解決緩存穿透一樣加鎖排隊;

建立備份緩存,緩存A和緩存B胁黑,A設置超時時間篙程,B不設置超時時間,先從A讀緩存别厘,A沒有讀B虱饿,并且更新A緩存和B緩存;

設置緩存超時時間的時候加上一個隨機的時間長度,比如這個緩存key的超時時間是固定的5分鐘加上隨機的2分鐘,醬紫可從一定程度上避免雪崩問題氮发;

Redis 和 Memecache 有什么區(qū)別渴肉?

Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫爽冕。不過memcache還可用于緩存其他東西仇祭,例如圖片、視頻等等颈畸。

Redis不僅僅支持簡單的k/v類型的數(shù)據(jù)乌奇,同時還提供list,set眯娱,hash等數(shù)據(jù)結構的存儲礁苗。

虛擬內(nèi)存–Redis當物理內(nèi)存用完時,可以將一些很久沒用到的value 交換到磁盤

過期策略–memcache在set時就指定徙缴,例如set key1 0 0 8,即永不過期试伙。Redis可以通過例如expire 設定,例如expire name 10

分布式–設定memcache集群于样,利用magent做一主多從;redis可以做一主多從疏叨。都可以一主一從

存儲數(shù)據(jù)安全–memcache掛掉后,數(shù)據(jù)沒了穿剖;redis可以定期保存到磁盤(持久化)

災難恢復–memcache掛掉后蚤蔓,數(shù)據(jù)不可恢復; redis數(shù)據(jù)丟失后可以通過aof恢復

Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份糊余。

Redis的分布式鎖如何實現(xiàn)昌粤,有什么優(yōu)缺點?

1.分布式鎖需要解決的問題

互斥性:任意時刻只能有一個客戶端擁有鎖啄刹,不能同時多個客戶端獲取

安全性:鎖只能被持有該鎖的用戶刪除,而不能被其他用戶刪除

死鎖:獲取鎖的客戶端因為某些原因而宕機凄贩,而未能釋放鎖誓军,其他客戶端無法獲取此鎖,需要有機制來避免該類問題的發(fā)生

容錯:當部分節(jié)點宕機疲扎,客戶端仍能獲取鎖或者釋放鎖昵时。

2.如何通過Redis實現(xiàn)分布式鎖:(非完善方法)

SETNX key value :如果key不存在,則創(chuàng)建并賦值

時間復雜度: 0(1)

返回值:設置成功,返回1;設置失敗,返回0。

但是此時我們獲取的key是長期有效的椒丧,所以我們應該如何解決長期有效的問題呢壹甥?

如何解決SETNX長期有效的問題?

EXPIRE key seconds

設置key的生存時間,當key過期時(生存時間為0) ,會被自動刪除

缺點:原子性得不到滿足

3.如何通過Redis實現(xiàn)分布式鎖:(正確方式)

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

EX second :設置鍵的過期時間為second秒

PX millisecond :設置鍵的過期時間為millisecond毫秒

NX :只在鍵不存在時,才對鍵進行設置操作

XX:只在鍵已經(jīng)存在時,才對鍵進行設置操作

SET操作成功完成時,返回OK ,否則返回nil

4.大量的key同時過期的注意事項

集中過期,由于清除大量的key很耗時,會出現(xiàn)短暫的卡頓現(xiàn)象

解放方案:在設置key的過期時間的時候,給每個key加上隨機值

特殊場景1:超時后使用del 導致誤刪其他線程的鎖

又是一個極端場景,假如某線程成功得到了鎖壶熏,并且設置的超時時間是30秒句柠。

如果某些原因?qū)е戮€程B執(zhí)行的很慢很慢,過了30秒都沒執(zhí)行完,這時候鎖過期自動釋放溯职,線程B得到了鎖精盅。

隨后,線程A執(zhí)行完了任務谜酒,線程A接著執(zhí)行del指令來釋放鎖叹俏。但這時候線程B還沒執(zhí)行完,線程A實際上刪除的是線程B加的鎖僻族。

怎么避免這種情況呢粘驰?可以在del釋放鎖之前做一個判斷,驗證當前的鎖是不是自己加的鎖述么。

至于具體的實現(xiàn)蝌数,可以在加鎖的時候把當前的線程ID當做value,并在刪除之前驗證key對應的value是不是自己線程的ID碉输。

if判斷和釋放鎖是兩個獨立操作籽前,不是原子性。

我們都是追求極致的程序員敷钾,所以這一塊要用Lua腳本來實現(xiàn):

這樣一來枝哄,驗證和刪除過程就是原子操作了。

特殊場景2: 出現(xiàn)并發(fā)的可能性

還是剛才的場景1阻荒,雖然我們避免了線程A誤刪掉key的情況挠锥,但是同一時間有A,B兩個線程在訪問代碼塊侨赡,仍然是不完美的蓖租。

怎么辦呢?我們可以讓獲得鎖的線程開啟一個守護線程羊壹,用來給快要過期的鎖“續(xù)航”蓖宦。

當過去了29秒,線程A還沒執(zhí)行完油猫,這時候守護線程會執(zhí)行expire指令稠茂,為這把鎖“續(xù)命”20秒。守護線程從第29秒開始執(zhí)行情妖,每20秒執(zhí)行一次睬关。

當線程A執(zhí)行完任務,會顯式關掉守護線程毡证。

另一種情況电爹,如果節(jié)點1 忽然斷電,由于線程A和守護線程在同一個進程料睛,守護線程也會停下丐箩。這把鎖到了超時的時候摇邦,沒人給它續(xù)命,也就自動釋放了雏蛮。

由于文章限制小編把剩下的面試題整理成文檔和視頻的形勢列在下方涎嚼,面試哪里還不懂?趕緊領取資料吧挑秉!

獲取方式:轉(zhuǎn)發(fā)文章關注小編法梯,++++Vx : bjmsb2020來進行領取吧~~~~

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市犀概,隨后出現(xiàn)的幾起案子立哑,更是在濱河造成了極大的恐慌,老刑警劉巖姻灶,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铛绰,死亡現(xiàn)場離奇詭異,居然都是意外死亡产喉,警方通過查閱死者的電腦和手機捂掰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曾沈,“玉大人这嚣,你說我怎么就攤上這事∪悖” “怎么了姐帚?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長障涯。 經(jīng)常有香客問我罐旗,道長,這世上最難降的妖魔是什么唯蝶? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任九秀,我火速辦了婚禮,結果婚禮上粘我,老公的妹妹穿的比我還像新娘鼓蜒。我一直安慰自己,他們只是感情好涂滴,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晴音,像睡著了一般柔纵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锤躁,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天搁料,我揣著相機與錄音,去河邊找鬼。 笑死郭计,一個胖子當著我的面吹牛霸琴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昭伸,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼梧乘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庐杨?” 一聲冷哼從身側(cè)響起选调,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灵份,沒想到半個月后仁堪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡填渠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年弦聂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氛什。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡莺葫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屉更,到底是詐尸還是另有隱情徙融,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布瑰谜,位于F島的核電站欺冀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏萨脑。R本人自食惡果不足惜隐轩,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渤早。 院中可真熱鬧职车,春花似錦、人聲如沸鹊杖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骂蓖。三九已至积瞒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間登下,已是汗流浹背茫孔。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工叮喳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缰贝。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓馍悟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剩晴。 傳聞我的和親對象是個殘疾皇子锣咒,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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