坑人無數(shù)的Redis面試題

Redis在互聯(lián)網(wǎng)技術(shù)存儲方面使用如此廣泛秫筏,幾乎所有的后端技術(shù)面試官都要在Redis的使用和原理方面對小伙伴們進(jìn)行各種刁難伐脖。作為一名在互聯(lián)網(wǎng)技術(shù)行業(yè)打擊過成百上千名【請?jiān)试S我夸張一下】的資深技術(shù)面試官,看過了無數(shù)落寞的身影失望的離開昧谊,略感愧疚懦铺,故獻(xiàn)上此文担败,希望各位讀者以后面試勢如破竹殿托,永無失斉铡剧蚣!

看看美女支竹,激活你的腦細(xì)胞

Redis有哪些數(shù)據(jù)結(jié)構(gòu)?

字符串String鸠按、字典Hash礼搁、列表List、集合Set目尖、有序集合SortedSet馒吴。

如果你是Redis中高級用戶,還需要加上下面幾種數(shù)據(jù)結(jié)構(gòu)HyperLogLog瑟曲、Geo饮戳、Pub/Sub。

如果你說還玩過Redis Module洞拨,像BloomFilter扯罐,RedisSearch,Redis-ML烦衣,面試官得眼睛就開始發(fā)亮了歹河。

使用過Redis分布式鎖么,它是什么回事花吟?

先拿setnx來爭搶鎖秸歧,搶到之后,再用expire給鎖加一個過期時(shí)間防止鎖忘記了釋放衅澈。

這時(shí)候?qū)Ψ綍嬖V你說你回答得不錯键菱,然后接著問如果在setnx之后執(zhí)行expire之前進(jìn)程意外crash或者要重啟維護(hù)了,那會怎么樣今布?

這時(shí)候你要給予驚訝的反饋:唉纱耻,是喔芭梯,這個鎖就永遠(yuǎn)得不到釋放了。緊接著你需要抓一抓自己得腦袋弄喘,故作思考片刻玖喘,好像接下來的結(jié)果是你主動思考出來的,然后回答:我記得set指令有非常復(fù)雜的參數(shù)蘑志,這個應(yīng)該是可以同時(shí)把setnx和expire合成一條指令來用的累奈!對方這時(shí)會顯露笑容,心里開始默念:摁急但,這小子還不錯澎媒。

假如Redis里面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的波桩,如果將它們?nèi)空页鰜恚?/b>

使用keys指令可以掃出指定模式的key列表戒努。

對方接著追問:如果這個redis正在給線上的業(yè)務(wù)提供服務(wù),那使用keys指令會有什么問題镐躲?

這個時(shí)候你要回答redis關(guān)鍵的一個特性:redis的單線程的储玫。keys指令會導(dǎo)致線程阻塞一段時(shí)間,線上服務(wù)會停頓萤皂,直到指令執(zhí)行完畢撒穷,服務(wù)才能恢復(fù)。這個時(shí)候可以使用scan指令裆熙,scan指令可以無阻塞的提取出指定模式的key列表端礼,但是會有一定的重復(fù)概率,在客戶端做一次去重就可以了入录,但是整體所花費(fèi)的時(shí)間會比直接用keys指令長蛤奥。

使用過Redis做異步隊(duì)列么,你是怎么用的僚稿?

一般使用list結(jié)構(gòu)作為隊(duì)列凡桥,rpush生產(chǎn)消息,lpop消費(fèi)消息贫奠。當(dāng)lpop沒有消息的時(shí)候唬血,要適當(dāng)sleep一會再重試。

如果對方追問可不可以不用sleep呢唤崭?list還有個指令叫blpop拷恨,在沒有消息的時(shí)候,它會阻塞住直到消息到來谢肾。

如果對方追問能不能生產(chǎn)一次消費(fèi)多次呢腕侄?使用pub/sub主題訂閱者模式,可以實(shí)現(xiàn)1:N的消息隊(duì)列。

如果對方追問pub/sub有什么缺點(diǎn)冕杠?在消費(fèi)者下線的情況下微姊,生產(chǎn)的消息會丟失,得使用專業(yè)的消息隊(duì)列如rabbitmq等分预。

如果對方追問redis如何實(shí)現(xiàn)延時(shí)隊(duì)列兢交?我估計(jì)現(xiàn)在你很想把面試官一棒打死如果你手上有一根棒球棍的話,怎么問的這么詳細(xì)笼痹。但是你很克制配喳,然后神態(tài)自若的回答道:使用sortedset,拿時(shí)間戳作為score凳干,消息內(nèi)容作為key調(diào)用zadd來生產(chǎn)消息晴裹,消費(fèi)者用zrangebyscore指令獲取N秒之前的數(shù)據(jù)輪詢進(jìn)行處理。

到這里救赐,面試官暗地里已經(jīng)對你豎起了大拇指涧团。但是他不知道的是此刻你卻豎起了中指,在椅子背后经磅。

如果有大量的key需要設(shè)置同一時(shí)間過期泌绣,一般需要注意什么?

如果大量的key過期時(shí)間設(shè)置的過于集中馋贤,到過期的那個時(shí)間點(diǎn)赞别,redis可能會出現(xiàn)短暫的卡頓現(xiàn)象畏陕。一般需要在時(shí)間上加一個隨機(jī)值配乓,使得過期時(shí)間分散一些。

Redis如何做持久化的惠毁?

bgsave做鏡像全量持久化犹芹,aof做增量持久化。因?yàn)閎gsave會耗費(fèi)較長時(shí)間鞠绰,不夠?qū)崟r(shí)腰埂,在停機(jī)的時(shí)候會導(dǎo)致大量丟失數(shù)據(jù),所以需要aof來配合使用蜈膨。在redis實(shí)例重啟時(shí)屿笼,會使用bgsave持久化文件重新構(gòu)建內(nèi)存,再使用aof重放近期的操作指令來實(shí)現(xiàn)完整恢復(fù)重啟之前的狀態(tài)翁巍。

對方追問那如果突然機(jī)器掉電會怎樣驴一?取決于aof日志sync屬性的配置,如果不要求性能灶壶,在每條寫指令時(shí)都sync一下磁盤肝断,就不會丟失數(shù)據(jù)。但是在高性能的要求下每次都sync是不現(xiàn)實(shí)的,一般都使用定時(shí)sync胸懈,比如1s1次担扑,這個時(shí)候最多就會丟失1s的數(shù)據(jù)。

對方追問bgsave的原理是什么趣钱?你給出兩個詞匯就可以了涌献,fork和cow。fork是指redis通過創(chuàng)建子進(jìn)程來進(jìn)行bgsave操作首有,cow指的是copy on write洁奈,子進(jìn)程創(chuàng)建后,父子進(jìn)程共享數(shù)據(jù)段绞灼,父進(jìn)程繼續(xù)提供讀寫服務(wù)利术,寫臟的頁面數(shù)據(jù)會逐漸和子進(jìn)程分離開來。

Pipeline有什么好處低矮,為什么要用pipeline印叁?

可以將多次IO往返的時(shí)間縮減為一次,前提是pipeline執(zhí)行的指令之間沒有因果相關(guān)性军掂。使用redis-benchmark進(jìn)行壓測的時(shí)候可以發(fā)現(xiàn)影響redis的QPS峰值的一個重要因素是pipeline批次指令的數(shù)目轮蜕。

Redis的同步機(jī)制了解么?

Redis可以使用主從同步蝗锥,從從同步跃洛。第一次同步時(shí),主節(jié)點(diǎn)做一次bgsave终议,并同時(shí)將后續(xù)修改操作記錄到內(nèi)存buffer汇竭,待完成后將rdb文件全量同步到復(fù)制節(jié)點(diǎn),復(fù)制節(jié)點(diǎn)接受完成后將rdb鏡像加載到內(nèi)存穴张。加載完成后细燎,再通知主節(jié)點(diǎn)將期間修改的操作記錄同步到復(fù)制節(jié)點(diǎn)進(jìn)行重放就完成了同步過程。

是否使用過Redis集群皂甘,集群的原理是什么玻驻?

Redis Sentinal著眼于高可用,在master宕機(jī)時(shí)會自動將slave提升為master偿枕,繼續(xù)提供服務(wù)璧瞬。

Redis Cluster著眼于擴(kuò)展性,在單個redis內(nèi)存不足時(shí)渐夸,使用Cluster進(jìn)行分片存儲嗤锉。

前方女神等著你,加油捺萌!

繼續(xù)閱讀更多面試經(jīng)驗(yàn)档冬,關(guān)注知乎專欄【碼洞

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膘茎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酷誓,更是在濱河造成了極大的恐慌披坏,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盐数,死亡現(xiàn)場離奇詭異棒拂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)玫氢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門帚屉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漾峡,你說我怎么就攤上這事攻旦。” “怎么了生逸?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵牢屋,是天一觀的道長。 經(jīng)常有香客問我槽袄,道長烙无,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任遍尺,我火速辦了婚禮截酷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乾戏。我一直安慰自己迂苛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布歧蕉。 她就那樣靜靜地躺著灾部,像睡著了一般康铭。 火紅的嫁衣襯著肌膚如雪惯退。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天从藤,我揣著相機(jī)與錄音催跪,去河邊找鬼。 笑死夷野,一個胖子當(dāng)著我的面吹牛懊蒸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悯搔,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼骑丸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起通危,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铸豁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菊碟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體节芥,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年逆害,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了头镊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡魄幕,死狀恐怖相艇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纯陨,我是刑警寧澤厂捞,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站队丝,受9級特大地震影響靡馁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜机久,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一臭墨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膘盖,春花似錦胧弛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至软棺,卻和暖如春红竭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喘落。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工茵宪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘦棋。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓稀火,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赌朋。 傳聞我的和親對象是個殘疾皇子凰狞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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