干貨 | 關于Redis 的面試題(Java面試)



 1.Redis是什么?
Redis本質上是一個Key-Value類型的內存數(shù)據(jù)庫,很像memcached,整個數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內存當中進行操作,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù)flush到硬盤上進行保存。

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

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

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

2.Redis相比memcached有哪些優(yōu)勢?
① memcached所有的值均是簡單的字符串,redis作為 其替代者,支持更為豐富的數(shù)據(jù)類型
②redis的速度比memcached快很多
③ redis可以持久化其數(shù)據(jù)

3.Redis有哪幾種數(shù)據(jù)淘汰策略?
Redis有哪幾種數(shù)據(jù)淘汰策略?有noeviction、allkeys-lru、allkeys-random、volatile-random、volatile-ttl五種淘汰策略,下面我們分別介紹。

noeviction:返回錯誤當內存限制達到并且客戶端嘗試執(zhí)行會讓更多內存被使用的命令(部分的寫入指令,但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ù)有空間存放

4.Redis所有數(shù)據(jù)放到內存中的原因是什么?
Redis為了達到最快的讀寫速度將數(shù)據(jù)都讀到內存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。

所以redis具有快速和數(shù)據(jù)持久化的特征。如果不將數(shù)據(jù)放在內存中,磁盤I/O速度為嚴重影響redis的性能。在內存越來越便宜的今天,redis將會越來越受歡迎。如果設置了最大使用的內存,則數(shù)據(jù)已有記錄數(shù)達到內存限值后不能繼續(xù)插入新值。

5.Redis適合在哪些場景使用?
①會話緩存(Session Cache)
最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Mem cached)的優(yōu)勢在于:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現(xiàn)在,他們還會這樣嗎?

幸運的是,隨著Redis這些年的改進,很容易找到怎么恰當?shù)氖褂肦edis來緩存會話的文檔。甚至廣為人知的商業(yè)平臺Magento也提供Redis的插件。

②全頁緩存(FPC)
除基本的會話token之外,Redis 還提供很簡便的FPC平臺;氐揭恢滦詥栴},即使重啟了Redis實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC。

再次以Magento為例,Magento 提供一個插件來使用Redis 作為全頁緩存后端。

此外,對WordPress的用戶來說,Pantheon 有一個非常好的插件wp redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。

③隊列
Reids在內存存儲引擎領域的一-大優(yōu)點是提供list和set操作,這使得Redis能作為一個很好的消息隊列平臺來使用。Redis作為隊列使用的操作,就類似于本地程序語言(如Python)對list 的push/pop操作。

如果你快速的在Google中搜索“Redis queues",你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創(chuàng)建非常好的后端工具,以滿足各種隊列需求。例如,Celery 有一個后臺就是使用Redis作為broker,你可以從這里去查看。

④排行榜/計數(shù)器
Redis在內存中對數(shù)字進行遞增或遞減的操作實現(xiàn)的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執(zhí)行這些操作的時候變的非常簡單,Redis 只是正好提供了這

兩種數(shù)據(jù)結構。所以,我們要從排序集合中獲取到排名最靠前的10個用戶-我們稱之為“user_scores", 我們只需要像下面一樣執(zhí)行即可:

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

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

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

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

②redis
cluster3.0自帶的集群,特點在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持節(jié)點設置從節(jié)點。具體看官方文檔介紹。

③在業(yè)務代碼層實現(xiàn)
起幾個毫無關聯(lián)的redis實例,在代碼層,對key進行hash計算,然后去對應的redis實例操作數(shù)據(jù)。這種方式對hash層代碼要求比較高,考慮部分包括,節(jié)點失效后的替代算法方案,數(shù)據(jù)震蕩后的自動腳本恢復,實例的監(jiān)控,等等。

北大青鳥網(wǎng)上報名
北大青鳥招生簡章