30道Redis面試題

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

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

因為是純內(nèi)存操作,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)等等。

另外Redis也可以對存入的Key-Value設置expire時間,因此也可以被當作一 個功能加強版的memcached來用。 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ù)類型?

String、List、Set、Sorted Set、hashes

4、Redis主要消耗什么物理資源?

內(nèi)存。

5、Redis的全稱是什么?

Remote Dictionary Server。

6、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ù)有空間存放。

7、Redis官方為什么不提供Windows版本?

因為目前Linux版本已經(jīng)相當穩(wěn)定,而且用戶量很大,無需開發(fā)windows版本,反而會帶來兼容性等問題。

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

512M

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

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

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

在內(nèi)存越來越便宜的今天,redis將會越來越受歡迎。 如果設置了最大使用的內(nèi)存,則數(shù)據(jù)已有記錄數(shù)達到內(nèi)存限值后不能繼續(xù)插入新值。

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

  1. twemproxy。大概概念是,它類似于一個代理方式,使用方法和普通redis無任何區(qū)別,設置好它下屬的多個redis實例后,使用時在本需要連接redis的地方改為連接twemproxy,它會以一個代理的身份接收請求并使用一致性hash算法,將請求轉(zhuǎn)接到具體redis,將結果再返回twemproxy。使用方式簡便(相對redis只需修改連接端口),對舊項目擴展的首選。 問題:twemproxy自身單端口實例的壓力,使用一致性hash后,對redis節(jié)點數(shù)量改變時候的計算值的改變,數(shù)據(jù)無法自動移動到新的節(jié)點。

2.codis。

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

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

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

值得看|30道Redis面試題,面試官能問的都被我找到了!(上)

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

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

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

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

13、Redis有哪些適合的場景?

(1)會話緩存(Session Cache)

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

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

(2)全頁緩存(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺。回到一致性問題,即使重啟了Redis實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC。

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

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

(3)隊列

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

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

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

Redis在內(nèi)存中對數(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ù)的,你可以在這里看到。

(5)發(fā)布/訂閱

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

14、Redis支持的Java客戶端都有哪些?官方推薦用哪個?

Redisson、Jedis、lettuce等等,官方推薦使用Redisson。

15、Redis和Redisson有什么關系?

Redisson是一個高級的分布式協(xié)調(diào)Redis客服端,能幫助用戶在分布式環(huán)境中輕松實現(xiàn)一些Java的對象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。

16、Jedis與Redisson對比有什么優(yōu)缺點?

Jedis是Redis的Java實現(xiàn)的客戶端,其API提供了比較全面的Redis命令的支持;

Redisson實現(xiàn)了分布式和可擴展的Java數(shù)據(jù)結構,和Jedis相比,功能較為簡單,不支持字符串操作,不支持排序、事務、管道、分區(qū)等Redis特性。Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務邏輯上。

17、Redis如何設置密碼及驗證密碼?

設置密碼:config set requirepass 123456

授權密碼:auth 123456

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

Redis集群沒有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽,集群的每個節(jié)點負責一部分hash槽。

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

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

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

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

值得看|30道Redis面試題,面試官能問的都被我找到了!(上)

21、Redis集群之間是如何復制的?

異步復制

22、Redis集群最大節(jié)點個數(shù)是多少?

16384個。

23、Redis集群如何選擇數(shù)據(jù)庫?

Redis集群目前無法做數(shù)據(jù)庫選擇,默認在0數(shù)據(jù)庫。

24、怎么測試Redis的連通性?

ping

25、Redis中的管道有什么用?

一次請求/響應服務器能實現(xiàn)處理新的請求即使舊的請求還未被響應。這樣就可以將多個命令發(fā)送到服務器,而不用等待回復,最后在一個步驟中讀取該答復。

這就是管道(pipelining),是一種幾十年來廣泛使用的技術。例如許多POP3協(xié)議已經(jīng)實現(xiàn)支持這個功能,大大加快了從服務器下載新郵件的過程。

26、怎么理解Redis事務?

事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執(zhí)行。事務在執(zhí)行的過程中,不會被其他客戶端發(fā)送來的命令請求所打斷。

事務是一個原子操作:事務中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行。

27、Redis事務相關的命令有哪幾個?

MULTI、EXEC、DISCARD、WATCH

28、Redis key的過期時間和永久有效分別怎么設置?

EXPIRE和PERSIST命令。

29、Redis如何做內(nèi)存優(yōu)化?

盡可能使用散列表(hashes),散列表(是說散列表里面存儲的數(shù)少)使用的內(nèi)存非常小,所以你應該盡可能的將你的數(shù)據(jù)模型抽象到一個散列表里面。

比如你的web系統(tǒng)中有一個用戶對象,不要為這個用戶的名稱,姓氏,郵箱,密碼設置單獨的key,而是應該把這個用戶的所有信息存儲到一張散列表里面。

30、Redis回收進程如何工作的?

一個客戶端運行了新的命令,添加了新的數(shù)據(jù)。

Redi檢查內(nèi)存使用情況,如果大于maxmemory的限制, 則根據(jù)設定好的策略進行回收。

一個新的命令被執(zhí)行,等等。

所以我們不斷地穿越內(nèi)存限制的邊界,通過不斷達到邊界然后不斷地回收回到邊界以下。

如果一個命令的結果導致大量內(nèi)存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內(nèi)存限制就會被這個內(nèi)存使用量超越。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1、什么是Redis? Redis本質(zhì)上是一個Key-Value類型的內(nèi)存數(shù)據(jù)庫,很像memcached,整個數(shù)據(jù)...
    夜風月圓閱讀 2,261評論 0 23
  • 1、什么是Redis? Redis本質(zhì)上是一個Key-Value類型的內(nèi)存數(shù)據(jù)庫,很像memcached,整個數(shù)據(jù)...
    為你變乖_09e6閱讀 1,028評論 0 20
  • 關于Mongodb的全面總結 MongoDB的內(nèi)部構造《MongoDB The Definitive Guide》...
    中v中閱讀 32,284評論 2 89
  • 基于內(nèi)存的NoSQL數(shù)據(jù)庫。提供五種數(shù)據(jù)結構的存儲。字符串、列表、集合、有序集合、散列表。Redis 支持很多特性...
    韓絕交閱讀 811評論 0 1

友情鏈接更多精彩內(nèi)容