最全Redis49題詳細答案:線程設(shè)計+哨兵+復制+事務+集群+持久化等

繼續(xù)Java最全面試題答案系列篇,之前分享了mysql、spring辅柴、多線程等最全答案,文末有相關(guān)獲取方式哦~

Redis支持哪幾種數(shù)據(jù)類型瞭吃?

支持多種類型的數(shù)據(jù)結(jié)構(gòu)

1.string:最基本的數(shù)據(jù)類型碌嘀,二進制安全的字符串,最大512M歪架。

2.list:按照添加順序保持順序的字符串列表筏餐。

3.set:無序的字符串集合,不存在重復的元素牡拇。

4.sorted set:已排序的字符串集合魁瞪。

5.hash:key-value對的一種集合。

Redis主要有哪些功能惠呼?

1.哨兵(Sentinel)和復制(Replication)

Redis服務器毫無征兆的罷工是個麻煩事导俘,如何保證備份的機器是原始服務器的完整備份呢?這時候就需要哨兵和復制剔蹋。

Sentinel可以管理多個Redis服務器旅薄,它提供了監(jiān)控,提醒以及自動的故障轉(zhuǎn)移的功能泣崩,Replication則是負責讓一個Redis服務器可以配備多個備份的服務器少梁。

Redis也是利用這兩個功能來保證Redis的高可用的

2.事務

很多情況下我們需要一次執(zhí)行不止一個命令,而且需要其同時成功或者失敗矫付。redis對事務的支持也是源自于這部分需求凯沪,即支持一次性按順序執(zhí)行多個命令的能力,并保證其原子性买优。

3.LUA腳本

在事務的基礎(chǔ)上妨马,如果我們需要在服務端一次性的執(zhí)行更復雜的操作(包含一些邏輯判斷)挺举,則lua就可以排上用場了

4.持久化

redis的持久化指的是redis會把內(nèi)存的中的數(shù)據(jù)寫入到硬盤中,在redis重新啟動的時候加載這些數(shù)據(jù)烘跺,從而最大限度的降低緩存丟失帶來的影響湘纵。

5.集群(Cluster)

單臺服務器資源的總是有上限的,CPU資源和IO資源我們可以通過主從復制滤淳,進行讀寫分離梧喷,把一部分CPU和IO的壓力轉(zhuǎn)移到從服務器上,這也有點類似mysql數(shù)據(jù)庫的主從同步脖咐。

在Redis官方的分布式方案出來之前伤柄,有twemproxy和codis兩種方案,這兩個方案總體上來說都是依賴proxy來進行分布式的文搂,下面的內(nèi)容有具體集群方案詳解。

Redis是單進程單線程的秤朗?

Redis是單進程單線程的煤蹭,Redis利用隊列技術(shù)將并發(fā)訪問變?yōu)榇性L問,消除了傳統(tǒng)數(shù)據(jù)庫串行控制的開銷取视。

Redis為什么是單線程的硝皂?

多線程處理會涉及到鎖,而且多線程處理會涉及到線程切換而消耗CPU作谭。因為CPU不是Redis的瓶頸稽物,Redis的瓶頸最有可能是機器內(nèi)存或者網(wǎng)絡(luò)帶寬。單線程無法發(fā)揮多核CPU性能折欠,不過可以通過在單機開多個Redis實例來解決贝或。

其它開源軟件采用的模型

Nginx:多進程單線程模型

Memcached:單進程多線程模型

使用Redis的優(yōu)勢?

1.速度快锐秦,因為數(shù)據(jù)存在內(nèi)存中咪奖,類似于HashMap,HashMap的優(yōu)勢就是查找和操作的時間復雜度都是O(1)

2. 支持豐富數(shù)據(jù)類型酱床,支持string羊赵,list,set扇谣,sorted set昧捷,hash

3.支持事務,操作都是原子性罐寨,所謂的原子性就是對數(shù)據(jù)的更改要么全部執(zhí)行靡挥,要么全部不執(zhí)行

4. 豐富的特性:可用于緩存,消息鸯绿,按key設(shè)置過期時間芹血,過期后將會自動刪除

Redis單點吞吐量

單點TPS達到8萬/秒贮泞,QPS達到10萬/秒,補充下TPS和QPS的概念

1.QPS:?應用系統(tǒng)每秒鐘最大能接受的用戶訪問量

每秒鐘處理完請求的次數(shù)幔烛,注意這里是處理完啃擦,具體是指發(fā)出請求到服務器處理完成功返回結(jié)果《鲂可以理解在server中有個counter令蛉,每處理一個請求加1,1秒后counter=QPS狡恬。

2.TPS:?每秒鐘最大能處理的請求數(shù)

每秒鐘處理完的事務次數(shù)珠叔,一個應用系統(tǒng)1s能完成多少事務處理,一個事務在分布式處理中弟劲,可能會對應多個請求祷安,對于衡量單個接口服務的處理能力,用QPS比較合理兔乞。

Redis相比memcached有哪些優(yōu)勢汇鞭?

1.memcached所有的值均是簡單的字符串,Redis作為其替代者庸追,支持更為豐富的數(shù)據(jù)類型

2.Redis的速度比memcached快很多

3.Redis可以持久化其數(shù)據(jù)

4.Redis支持數(shù)據(jù)的備份霍骄,即master-slave模式的數(shù)據(jù)備份。

Redis有哪幾種數(shù)據(jù)淘汰策略淡溯?

在Redis中读整,允許用戶設(shè)置最大使用內(nèi)存大小server.maxmemory,當Redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候咱娶,就會施行數(shù)據(jù)淘汰策略米间。

1.volatile-lru:從已設(shè)置過期的數(shù)據(jù)集中挑選最近最少使用的淘汰

2.volatile-ttr:從已設(shè)置過期的數(shù)據(jù)集中挑選將要過期的數(shù)據(jù)淘汰

3.volatile-random:從已設(shè)置過期的數(shù)據(jù)集中任意挑選數(shù)據(jù)淘汰

4.allkeys-lru:從數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰

5.allkeys-random:從數(shù)據(jù)集中任意挑選數(shù)據(jù)淘汰

6.noenviction:禁止淘汰數(shù)據(jù)

redis淘汰數(shù)據(jù)時還會同步到aof

Redis集群方案應該怎么做?都有哪些方案膘侮?

1.twemproxy

2.codis车伞,目前用的最多的集群方案,基本和twemproxy一致的效果喻喳,但它支持在 節(jié)點數(shù)量改變情況下另玖,舊節(jié)點數(shù)據(jù)可恢復到新hash節(jié)點。

3.Redis cluster3.0自帶的集表伦,特點在于他的分布式算法不是一致性hash谦去,而是hash槽的概念,以及自身支持節(jié)點設(shè)置從節(jié)點蹦哼。

具體請查看阿里架構(gòu)師進階專題:Redis集群的5種使用方式鳄哭,各自優(yōu)缺點分析

Redis讀寫分離模型

通過增加Slave DB的數(shù)量,讀的性能可以線性增長纲熏。為了避免Master DB的單點故障妆丘,集群一般都會采用兩臺Master DB做雙機熱備锄俄,所以整個集群的讀和寫的可用性都非常高。

讀寫分離架構(gòu)的缺陷在于勺拣,不管是Master還是Slave奶赠,每個節(jié)點都必須保存完整的數(shù)據(jù),如果在數(shù)據(jù)量很大的情況下药有,集群的擴展能力還是受限于單個節(jié)點的存儲能力毅戈,而且對于Write-intensive類型的應用,讀寫分離架構(gòu)并不適合愤惰。

Redis數(shù)據(jù)分片模型

為了解決讀寫分離模型的缺陷苇经,可以將數(shù)據(jù)分片模型應用進來。

可以將每個節(jié)點看成都是獨立的master宦言,然后通過業(yè)務實現(xiàn)數(shù)據(jù)分片扇单。

結(jié)合上面兩種模型,可以將每個master設(shè)計成由一個master和多個slave組成的模型奠旺。

Redis提供了哪幾種持久化方式蜘澜?

1. Redis主要提供了兩種持久化機制:RDB和AOF;

2.RDB

默認開啟凉倚,會按照配置的指定時間將內(nèi)存中的數(shù)據(jù)快照到磁盤中,創(chuàng)建一個dump.rdb文件嫂沉,Redis啟動時再恢復到內(nèi)存中稽寒。

Redis會單獨創(chuàng)建fork()一個子進程,將當前父進程的數(shù)據(jù)庫數(shù)據(jù)復制到子進程的內(nèi)存中趟章,然后由子進程寫入到臨時文件中杏糙,持久化的過程結(jié)束了,再用這個臨時文件替換上次的快照文件蚓土,然后子進程退出宏侍,內(nèi)存釋放。

需要注意的是蜀漆,每次快照持久化都會將主進程的數(shù)據(jù)庫數(shù)據(jù)復制一遍谅河,導致內(nèi)存開銷加倍,若此時內(nèi)存不足确丢,則會阻塞服務器運行绷耍,直到復制結(jié)束釋放內(nèi)存;都會將內(nèi)存數(shù)據(jù)完整寫入磁盤一次鲜侥,所以如果數(shù)據(jù)量大的話褂始,而且寫操作頻繁,必然會引起大量的磁盤I/O操作描函,嚴重影響性能崎苗,并且最后一次持久化后的數(shù)據(jù)可能會丟失狐粱;

3.AOF

以日志的形式記錄每個寫操作(讀操作不記錄),只需追加文件但不可以改寫文件胆数,Redis啟動時會根據(jù)日志從頭到尾全部執(zhí)行一遍以完成數(shù)據(jù)的恢復工作肌蜻。包括flushDB也會執(zhí)行。

主要有兩種方式觸發(fā):有寫操作就寫幅慌、每秒定時寫(也會丟數(shù)據(jù))宋欺。

因為AOF采用追加的方式,所以文件會越來越大胰伍,針對這個問題齿诞,新增了重寫機制,就是當日志文件大到一定程度的時候骂租,會fork出一條新進程來遍歷進程內(nèi)存中的數(shù)據(jù)祷杈,每條記錄對應一條set語句,寫到臨時文件中渗饮,然后再替換到舊的日志文件(類似rdb的操作方式)但汞。默認觸發(fā)是當aof文件大小是上次重寫后大小的一倍且文件大于64M時觸發(fā)。

當兩種方式同時開啟時互站,數(shù)據(jù)恢復Redis會優(yōu)先選擇AOF恢復私蕾。一般情況下,只要使用默認開啟的RDB即可胡桃,因為相對于AOF踩叭,RDB便于進行數(shù)據(jù)庫備份,并且恢復數(shù)據(jù)集的速度也要快很多翠胰。

開啟持久化緩存機制容贝,對性能會有一定的影響,特別是當設(shè)置的內(nèi)存滿了的時候之景,更是下降到幾百reqs/s斤富。所以如果只是用來做緩存的話,可以關(guān)掉持久化锻狗。

Redis常見性能問題和解決方案满力?

(1) Master最好不要做任何持久化工作,如RDB內(nèi)存快照和AOF日志文件

(2) 如果數(shù)據(jù)比較重要轻纪,某個Slave開啟AOF備份數(shù)據(jù)脚囊,策略設(shè)置為每秒同步一次

(3) 為了主從復制的速度和連接的穩(wěn)定性,Master和Slave最好在同一個局域網(wǎng)內(nèi)

(4) 盡量避免在壓力很大的主庫上增加從庫

(5) 主從復制不要用圖狀結(jié)構(gòu)桐磁,用單向鏈表結(jié)構(gòu)更為穩(wěn)定悔耘,即:Master <- Slave1 <- Slave2 <- Slave3...

這樣的結(jié)構(gòu)方便解決單點故障問題,實現(xiàn)Slave對Master的替換我擂。如果Master掛了衬以,可以立刻啟用Slave1做Master缓艳,其他不變。

Redis支持的Java客戶端都有哪些看峻?官方推薦用哪個阶淘?

Redisson、Jedis互妓、lettuce等等溪窒,官方推薦使用Redisson。

Redis哈希槽的概念冯勉?

Redis集群沒有使用一致性hash,而是引入了哈希槽的概念澈蚌,當需要在 Redis 集群中放置一個 key-value 時,根據(jù) CRC16(key) mod 16384的值灼狰,決定將一個key放到哪個桶中宛瞄。

Redis集群最大節(jié)點個數(shù)是多少?

Redis集群預分好16384個桶(哈希槽)

Redis集群的主從復制模型是怎樣的交胚?

為了使在部分節(jié)點失敗或者大部分節(jié)點無法通信的情況下集群仍然可用份汗,所以集群使用了主從復制模型,每個節(jié)點都會有N-1個復制品.

Redis集群會有寫操作丟失嗎?為什么蝴簇?

Redis并不能保證數(shù)據(jù)的強一致性杯活,這意味這在實際中集群在特定的條件下可能會丟失寫操作。

Redis集群之間是如何復制的熬词?

異步復制

Redis如何做內(nèi)存優(yōu)化旁钧?

盡可能使用散列表(hashes),散列表(是說散列表里面存儲的數(shù)少)使用的內(nèi)存非常小荡澎,所以你應該盡可能的將你的數(shù)據(jù)模型抽象到一個散列表里面均践。比如你的web系統(tǒng)中有一個用戶對象晤锹,不要為這個用戶的名稱摩幔,姓氏,郵箱鞭铆,密碼設(shè)置單獨的key,而是應該把這個用戶的所有信息存儲到一張散列表里面.

Redis回收進程如何工作的或衡?

一個客戶端運行了新的命令,添加了新的數(shù)據(jù)车遂。

Redi檢查內(nèi)存使用情況封断,如果大于maxmemory的限制, 則根據(jù)設(shè)定好的策略進行回收。

Redis回收使用的是什么算法舶担?

LRU算法

Redis有哪些適合的場景坡疼?

1)Session共享(單點登錄)

2)頁面緩存

3)隊列

4)排行榜/計數(shù)器

5)發(fā)布/訂閱

以上就是最全Redis詳細答案總結(jié)。

覺得不錯請點贊支持衣陶,歡迎留言或進我的個人群179961551領(lǐng)取【架構(gòu)資料專題目合集90期】柄瑰、【BATJTMD大廠JAVA面試真題1000+】闸氮,本群專用于學習交流技術(shù)、分享面試機會教沾,拒絕廣告蒲跨,我也會在群內(nèi)不定期答題、探討授翻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末或悲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子堪唐,更是在濱河造成了極大的恐慌巡语,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羔杨,死亡現(xiàn)場離奇詭異捌臊,居然都是意外死亡,警方通過查閱死者的電腦和手機兜材,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門理澎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人曙寡,你說我怎么就攤上這事糠爬。” “怎么了举庶?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵执隧,是天一觀的道長。 經(jīng)常有香客問我户侥,道長镀琉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任蕊唐,我火速辦了婚禮屋摔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘替梨。我一直安慰自己钓试,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布副瀑。 她就那樣靜靜地躺著弓熏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糠睡。 梳的紋絲不亂的頭發(fā)上挽鞠,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼信认。 笑死串稀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的狮杨。 我是一名探鬼主播母截,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼橄教!你這毒婦竟也來了清寇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤护蝶,失蹤者是張志新(化名)和其女友劉穎华烟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體持灰,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡盔夜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了堤魁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂链。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妥泉,靈堂內(nèi)的尸體忽然破棺而出椭微,到底是詐尸還是另有隱情,我是刑警寧澤盲链,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布蝇率,位于F島的核電站,受9級特大地震影響刽沾,放射性物質(zhì)發(fā)生泄漏本慕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一侧漓、第九天 我趴在偏房一處隱蔽的房頂上張望锅尘。 院中可真熱鬧,春花似錦火架、人聲如沸鉴象。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牛欢,卻和暖如春骡男,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背傍睹。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工隔盛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犹菱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓吮炕,卻偏偏與公主長得像腊脱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子龙亲,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355