Redis 作為一個開源的帅刊,高級的鍵值存儲和一個適用的解決方案,已經越來越在構建 「高性能」歹撒、「可擴展」 的 Web 應用上發(fā)揮著舉足輕重的作用应役。
當今互聯(lián)網技術架構中 Redis 已然成為了應用得最廣泛的中間件之一,它也是中高級后端工程技術面試 中面試官最喜歡問的工程技能之一唆阿,不僅僅要求著我們對基本的使用進行掌握益涧,更要深層次地理解 Redis 內部實現(xiàn)的細節(jié)原理。
熟練掌握 Redis驯鳖,甚至可以毫不夸張地說已經半只腳踏入心儀的公司了闲询。下面我們一起來盤點回顧一下 Redis 的面試經典問題,就不要再被面試官問得臉都綠了浅辙!
除了這些Redis面試題扭弧,我這邊也整理了一份 架構師全套視頻教程 和關于java的系統(tǒng)化資料,
有需要的朋友可以加q群:1103806531? 備注:簡書? ?免費領取~
?redis基礎面試題
1记舆、什么是Redis鸽捻?簡述它的優(yōu)缺點?
1. Redis本質上是一個Key-Value類型的內存數(shù)據庫泽腮,很像memcached御蒲。
2. 整個數(shù)據庫統(tǒng)統(tǒng)加載在內存當中進行操作,定期通過異步操作把數(shù)據庫數(shù)據flush到硬盤上進行保存诊赊。
3. 因為是純內存操作删咱,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作豪筝,是已知性能最快的Key-Value DB痰滋。
4. Redis的出色之處不僅僅是性能,Redis最大的魅力是支持保存多種數(shù)據結構续崖,此外單個value的最大限制是1G不像 memcached只能保存1MB的數(shù)據敲街,因此Redis可以用來實現(xiàn)很多有用的功能。
5. 比方說用他的List來做FIFO雙向鏈表严望,實現(xiàn)一個輕量級的高性 能消息隊列服務多艇,用他的Set可以做高性能的tag系統(tǒng)等等。
6. Redis也可以對存入的Key-Value設置expire時間像吻,因此也可以被當作一 個功能加強版的memcached來用峻黍。
7. Redis的主要缺點是數(shù)據庫容量受到物理內存的限制,不能用作海量數(shù)據的高性能讀寫拨匆,因此Redis適合的場景主要局限在較小數(shù)據量的高性能操作和運算上姆涩。
2、Redis相比memcached有哪些優(yōu)勢惭每?
1. memcached所有的值均是簡單的字符串骨饿,redis作為其替代者,支持更為豐富的數(shù)據類型
2. redis的速度比memcached快很多
3. redis可以持久化其數(shù)據
3、redis五種數(shù)據類型宏赘,每種數(shù)據類型應用在哪绒北?
1. Str(緩存)
2. List(消息隊列)
3. hashes(用戶id+對應屬性名稱作為唯一的標識來取得對應屬性的值)
4. Set(set類似list,特殊之處是set可以自動排重:找兩個人微博的共同好友)
5. Sorted Set sorted set的使用場景與set類似察署,區(qū)別是set不是自動有序的而sorted set可以通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序闷游,并且是插入有序的,即自動排序贴汪。
比如:twitter 的public timeline可以以發(fā)表時間作為score來存儲储藐,這樣獲取時就是自動按時間排好序的。
4嘶是、Redis有哪幾種數(shù)據淘汰策略?
noeviction:返回錯誤當內存限制達到并且客戶端嘗試執(zhí)行會讓更多內存被使用的命令(大部分的寫入指令蛛碌,但DEL和幾個例外)
allkeys-lru: 嘗試回收最少使用的鍵(LRU)聂喇,使得新添加的數(shù)據有空間存放。
volatile-lru: 嘗試回收最少使用的鍵(LRU)蔚携,但僅限于在過期集合的鍵,使得新添加的數(shù)據有空間存放希太。
allkeys-random: 回收隨機的鍵使得新添加的數(shù)據有空間存放。
volatile-random: 回收隨機的鍵使得新添加的數(shù)據有空間存放酝蜒,但僅限于在過期集合的鍵誊辉。
volatile-ttl: 回收在過期集合的鍵,并且優(yōu)先回收存活時間(TTL)較短的鍵,使得新添加的數(shù)據有空間存放亡脑。
5堕澄、一個字符串類型的值能存儲最大容量是多少?
512M
6霉咨、為什么Redis需要把所有數(shù)據放到內存中蛙紫?
Redis為了達到最快的讀寫速度將數(shù)據都讀到內存中,并通過異步的方式將數(shù)據寫入磁盤途戒。
所以redis具有快速和數(shù)據持久化的特征坑傅。如果不將數(shù)據放在內存中,磁盤I/O速度會嚴重影響redis的性能喷斋。
如果設置了最大使用的內存唁毒,則數(shù)據已有記錄數(shù)達到內存限值后不能繼續(xù)插入新值。
7星爪、Redis集群方案應該怎么做浆西?都有哪些方案?
1)codis顽腾。
codis目前用的最多的集群方案室谚,基本和twemproxy一致的效果,但它支持在 節(jié)點數(shù)量改變情況下,舊節(jié)點數(shù)據可恢復到新hash節(jié)點秒赤。
2)redis cluster3.0自帶的集群
特點在于他的分布式算法不是一致性hash猪瞬,而是hash槽的概念,以及自身支持節(jié)點設置從節(jié)點入篮。
3)在業(yè)務代碼層實現(xiàn)
起幾個毫無關聯(lián)的redis實例陈瘦,在代碼層,對key 進行hash計算潮售,然后去對應的redis實例操作數(shù)據痊项。
這種方式對hash層代碼要求比較高,考慮部分包括酥诽,節(jié)點失效后的替代算法方案鞍泉,數(shù)據震蕩后的自動腳本恢復,實例的監(jiān)控肮帐,等等咖驮。
8、Redis集群方案什么情況下會導致整個集群不可用训枢?
有A托修,B,C三個節(jié)點的集群,在沒有復制模型的情況下,如果節(jié)點B失敗了恒界,那么整個集群就會因為缺少5501-11000這個范圍的槽而不可用睦刃。
9、MySQL里有2000w數(shù)據十酣,redis中只存20w的數(shù)據涩拙,如何保證redis中的數(shù)據都是熱點數(shù)據?
redis內存數(shù)據集大小上升到一定大小的時候耸采,就會施行數(shù)據淘汰策略吃环。
10、說說Redis哈希槽的概念洋幻?
Redis集群沒有使用一致性hash,而是引入了哈希槽的概念郁轻,Redis集群有16384個哈希槽。
每個key通過CRC16校驗后對16384取模來決定放置哪個槽文留,集群的每個節(jié)點負責一部分hash槽好唯。
11、Redis集群的主從復制模型是怎樣的燥翅?
為了使在部分節(jié)點失敗或者大部分節(jié)點無法通信的情況下集群仍然可用骑篙,所以集群使用了主從復制模型,每個節(jié)點都會有N-1個復制品.
12、Redis集群會有寫操作丟失嗎森书?為什么靶端?
Redis并不能保證數(shù)據的強一致性谎势,這意味著在實際中集群在特定的條件下可能會丟失寫操作。
Redis有哪些適合的場景
1杨名、會話緩存(Session Cache)
最常用的一種使用Redis的情景是會話緩存(session cache)脏榆。
用Redis緩存會話比其他存儲(如Memcached)的優(yōu)勢在于:Redis提供持久化。
2台谍、全頁緩存(FPC)
除基本的會話token之外须喂,Redis還提供很簡便的FPC平臺。
回到一致性問題趁蕊,即使重啟了Redis實例坞生,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降掷伙,這是一個極大改進是己,類似PHP本地FPC。
3任柜、隊列
Reids在內存存儲引擎領域的一大優(yōu)點是提供 list 和 set 操作卒废,這使得Redis能作為一個很好的消息隊列平臺來使用。
Redis作為隊列使用的操作乘盼,就類似于本地程序語言(如Python)對 list 的 push/pop 操作。
4俄烁、排行榜/計數(shù)器
Redis在內存中對數(shù)字進行遞增或遞減的操作實現(xiàn)的非常好绸栅。
集合(Set)和有序集合(Sorted Set)也使得我們在執(zhí)行這些操作的時候變得非常簡單,Redis只是正好提供了這兩種數(shù)據結構页屠。
所以粹胯,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執(zhí)行即可:
當然辰企,這是假定你是根據你用戶的分數(shù)做遞增的排序风纠。如果你想返回用戶及用戶的分數(shù),你需要這樣執(zhí)行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個很好的例子牢贸,用Ruby實現(xiàn)的竹观,它的排行榜就是使用Redis來存儲數(shù)據的,你可以在這里看到潜索。
5臭增、發(fā)布/訂閱
發(fā)布/訂閱的使用場景確實非常多。我已看見人們在社交網絡連接中使用竹习,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器誊抛,甚至用Redis的發(fā)布/訂閱功能來建立聊天系統(tǒng)!
最后
希望這篇文章對大家有幫助整陌!
我這邊也整理了一份 架構師全套視頻教程 和關于java的系統(tǒng)化資料拗窃,包括java核心知識點瞎领、面試專題和20年最新的互聯(lián)網真題、電子書等都有随夸。
有需要的朋友可以加q群:1103806531? 備注:簡書? ?免費領取~