必問Redis面試題—媽媽再也不用擔心我面試被問Redis了

Redis 作為一個開源的,高級的鍵值存儲和一個適用的解決方案,已經(jīng)越來越在構建 「高性能」、「可擴展」 的 Web 應用上發(fā)揮著舉足輕重的作用。

當今互聯(lián)網(wǎng)技術架構中 Redis 已然成為了應用得最廣泛的中間件之一,它也是中高級后端工程技術面試 中面試官最喜歡問的工程技能之一,不僅僅要求著我們對基本的使用進行掌握,更要深層次地理解 Redis 內(nèi)部實現(xiàn)的細節(jié)原理。

熟練掌握 Redis,甚至可以毫不夸張地說已經(jīng)半只腳踏入心儀的公司了。下面我們一起來盤點回顧一下 Redis 的面試經(jīng)典問題,就不要再被面試官問得臉都綠了!

除了這些Redis面試題,我這邊也整理了一份 架構師全套視頻教程 和關于java的系統(tǒng)化資料,

有需要的朋友可以加q群:1103806531? 備注:簡書? ?免費領取~

?redis基礎面試題

1、什么是Redis?簡述它的優(yōu)缺點?

1. Redis本質(zhì)上是一個Key-Value類型的內(nèi)存數(shù)據(jù)庫,很像memcached。

2. 整個數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內(nèi)存當中進行操作,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù)flush到硬盤上進行保存。

3. 因為是純內(nèi)存操作,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB。

4. Redis的出色之處不僅僅是性能,Redis最大的魅力是支持保存多種數(shù)據(jù)結(jié)構,此外單個value的最大限制是1G不像 memcached只能保存1MB的數(shù)據(jù),因此Redis可以用來實現(xiàn)很多有用的功能。

5. 比方說用他的List來做FIFO雙向鏈表,實現(xiàn)一個輕量級的高性 能消息隊列服務,用他的Set可以做高性能的tag系統(tǒng)等等。

6. Redis也可以對存入的Key-Value設置expire時間,因此也可以被當作一 個功能加強版的memcached來用。

7. Redis的主要缺點是數(shù)據(jù)庫容量受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫,因此Redis適合的場景主要局限在較小數(shù)據(jù)量的高性能操作和運算上。

2、Redis相比memcached有哪些優(yōu)勢?

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

2. redis的速度比memcached快很多

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

3、redis五種數(shù)據(jù)類型,每種數(shù)據(jù)類型應用在哪?

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ù)據(jù)淘汰策略?

noeviction:返回錯誤當內(nèi)存限制達到并且客戶端嘗試執(zhí)行會讓更多內(nèi)存被使用的命令(大部分的寫入指令,但DEL和幾個例外)

allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的數(shù)據(jù)有空間存放。

volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的數(shù)據(jù)有空間存放。

allkeys-random: 回收隨機的鍵使得新添加的數(shù)據(jù)有空間存放。

volatile-random: 回收隨機的鍵使得新添加的數(shù)據(jù)有空間存放,但僅限于在過期集合的鍵。

volatile-ttl: 回收在過期集合的鍵,并且優(yōu)先回收存活時間(TTL)較短的鍵,使得新添加的數(shù)據(jù)有空間存放。

5、一個字符串類型的值能存儲最大容量是多少?

512M

6、為什么Redis需要把所有數(shù)據(jù)放到內(nèi)存中?

Redis為了達到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。

所以redis具有快速和數(shù)據(jù)持久化的特征。如果不將數(shù)據(jù)放在內(nèi)存中,磁盤I/O速度會嚴重影響redis的性能。

如果設置了最大使用的內(nèi)存,則數(shù)據(jù)已有記錄數(shù)達到內(nèi)存限值后不能繼續(xù)插入新值。

7、Redis集群方案應該怎么做?都有哪些方案?

1)codis。

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

2)redis cluster3.0自帶的集群

特點在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持節(jié)點設置從節(jié)點。

3)在業(yè)務代碼層實現(xiàn)

起幾個毫無關聯(lián)的redis實例,在代碼層,對key 進行hash計算,然后去對應的redis實例操作數(shù)據(jù)。

這種方式對hash層代碼要求比較高,考慮部分包括,節(jié)點失效后的替代算法方案,數(shù)據(jù)震蕩后的自動腳本恢復,實例的監(jiān)控,等等。

8、Redis集群方案什么情況下會導致整個集群不可用?

有A,B,C三個節(jié)點的集群,在沒有復制模型的情況下,如果節(jié)點B失敗了,那么整個集群就會因為缺少5501-11000這個范圍的槽而不可用。

9、MySQL里有2000w數(shù)據(jù),redis中只存20w的數(shù)據(jù),如何保證redis中的數(shù)據(jù)都是熱點數(shù)據(jù)?

redis內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候,就會施行數(shù)據(jù)淘汰策略。

10、說說Redis哈希槽的概念?

Redis集群沒有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384個哈希槽。

每個key通過CRC16校驗后對16384取模來決定放置哪個槽,集群的每個節(jié)點負責一部分hash槽。

11、Redis集群的主從復制模型是怎樣的?

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

12、Redis集群會有寫操作丟失嗎?為什么?

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

Redis有哪些適合的場景

1、會話緩存(Session Cache)

最常用的一種使用Redis的情景是會話緩存(session cache)。

用Redis緩存會話比其他存儲(如Memcached)的優(yōu)勢在于:Redis提供持久化。

2、全頁緩存(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺。

回到一致性問題,即使重啟了Redis實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC。

3、隊列

Reids在內(nèi)存存儲引擎領域的一大優(yōu)點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平臺來使用。

Redis作為隊列使用的操作,就類似于本地程序語言(如Python)對 list 的 push/pop 操作。

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

Redis在內(nèi)存中對數(shù)字進行遞增或遞減的操作實現(xiàn)的非常好。

集合(Set)和有序集合(Sorted Set)也使得我們在執(zhí)行這些操作的時候變得非常簡單,Redis只是正好提供了這兩種數(shù)據(jù)結(jié)構。

所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執(zhí)行即可:

當然,這是假定你是根據(jù)你用戶的分數(shù)做遞增的排序。如果你想返回用戶及用戶的分數(shù),你需要這樣執(zhí)行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一個很好的例子,用Ruby實現(xiàn)的,它的排行榜就是使用Redis來存儲數(shù)據(jù)的,你可以在這里看到。

5、發(fā)布/訂閱

發(fā)布/訂閱的使用場景確實非常多。我已看見人們在社交網(wǎng)絡連接中使用,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器,甚至用Redis的發(fā)布/訂閱功能來建立聊天系統(tǒng)!

最后

希望這篇文章對大家有幫助!

我這邊也整理了一份 架構師全套視頻教程 和關于java的系統(tǒng)化資料,包括java核心知識點、面試專題和20年最新的互聯(lián)網(wǎng)真題、電子書等都有。

有需要的朋友可以加q群:1103806531? 備注:簡書? ?免費領取~

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。