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? 備注:簡書? ?免費領取~