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



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

因?yàn)槭羌儍?nèi)存操作,Redis 的性能非常出色,每秒可以處理超過(guò)10萬(wàn)次讀寫(xiě)操作,是已知性能最快的Key-Value DB。

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

比方說(shuō)用他的List來(lái)做FIFO雙向鏈表,實(shí)現(xiàn)一個(gè)輕量級(jí)的高性能消息隊(duì)列服務(wù),用他的Set可以做高性能的tag系統(tǒng)等等。

2.Redis相比memcached有哪些優(yōu)勢(shì)?
① memcached所有的值均是簡(jiǎn)單的字符串,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:返回錯(cuò)誤當(dāng)內(nèi)存限制達(dá)到并且客戶端嘗試執(zhí)行會(huì)讓更多內(nèi)存被使用的命令(部分的寫(xiě)入指令,但DEL和幾個(gè)例外)

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

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

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

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

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

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

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

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

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

②全頁(yè)緩存(FPC)
除基本的會(huì)話token之外,Redis 還提供很簡(jiǎn)便的FPC平臺(tái);氐揭恢滦詥(wèn)題,即使重啟了Redis實(shí)例,因?yàn)橛写疟P(pán)的持久化,用戶也不會(huì)看到頁(yè)面加載速度的下降,這是一個(gè)極大改進(jìn),類似PHP本地FPC。

再次以Magento為例,Magento 提供一個(gè)插件來(lái)使用Redis 作為全頁(yè)緩存后端。

此外,對(duì)WordPress的用戶來(lái)說(shuō),Pantheon 有一個(gè)非常好的插件wp redis,這個(gè)插件能幫助你以最快速度加載你曾瀏覽過(guò)的頁(yè)面。

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

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

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

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

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

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

⑤發(fā)布/訂閱
最后(但肯定不是最不重要的)是Redis的發(fā)布/訂閱功能。發(fā)布/訂閱的使用場(chǎng)景確實(shí)非常多。我已看見(jiàn)人們?cè)谏缃痪W(wǎng)絡(luò)連接中使用,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器,甚至用Redis的發(fā)布/訂閱功能來(lái)建立聊天系統(tǒng)!

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

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

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

北大青鳥(niǎo)網(wǎng)上報(bào)名
北大青鳥(niǎo)招生簡(jiǎn)章