100-Redis面試題

1、什麼是 Redis?簡述它的優缺點?web

Redis 本質上是一個 Key-Value 類型的內存數據庫,很像 memcached,整個數據庫通通加載在內存當中進行操做,按期經過異步操做把數據庫數據 flush 到硬盤上進行保存。redis

由於是純內存操做,Redis 的性能很是出色,每秒能夠處理超過 10 萬次讀寫操做,是已知性能最快的 Key-Value DB算法

Redis 的出色之處不只僅是性能,Redis 最大的魅力是支持保存多種數據結構,此外單個 value 的最大限制是 1GB,不像 memcached 只能保存 1MB 的數據,所以 Redis 能夠用來實現不少有用的功能。比方說用他的 List 來作 FIFO 雙向鏈表,實現一個輕量級的高性  能消息隊列服務,用他的 Set 能夠作高性能的 tag 系統等等。數據庫

另外 Redis 也能夠對存入的 Key-Value 設置 expire 時間,所以也能夠被看成一 個功能增強版的 memcached 來用。  Redis 的主要缺點是數據庫容量受到物理內存的限制,不能用做海量數據的高性能讀寫,所以 Redis 適合的場景主要侷限在較小數據量的高性能操做和運算上。windows

 

2Redis 相比 memcached 有哪些優點?後端

(1) memcached 全部的值均是簡單的字符串,redis 做爲其替代者,支持更爲豐富的數據類型緩存

(2) redis 的速度比 memcached 快不少服務器

(3) redis 能夠持久化其數據網絡

 

3Redis 支持哪幾種數據類型?session

StringListSetSorted Sethashes

 

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

內存。

 

5Redis 的全稱是什麼?

Remote Dictionary Server

 

6Redis 有哪幾種數據淘汰策略?

noeviction:返回錯誤當內存限制達到而且客戶端嘗試執行會讓更多內存被使用的命令(大部分的寫入指令,但 DEL 和幾個例外)allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的數據有空間存放。

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

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

volatile-random: 回收隨機的鍵使得新添加的數據有空間存放,但僅限於在過時集合的鍵。

volatile-ttl:  回收在過時集合的鍵,而且優先回收存活時間(TTL)較短的鍵,使得新添加的數據有空間存

放。

 

7Redis 官方爲何不提供 Windows 版本?

由於目前 Linux 版本已經至關穩定,並且用戶量很大,無需開發 windows 版本,反而會帶來兼容性等問題。

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

512M

 

9、爲何 Redis 須要把全部數據放到內存中?

Redis 爲了達到最快的讀寫速度將數據都讀到內存中,並經過異步的方式將數據寫入磁盤。

因此 redis 具備快速和數據持久化的特徵。若是不將數據放在內存中,磁盤 I/O 速度爲嚴重影響 redis 的性能。在內存愈來愈便宜的今天,redis 將會愈來愈受歡迎。 若是設置了最大使用的內存,則數據已有記錄數達到內存限值後不能繼續插入新值。

 

10Redis 集羣方案應該怎麼作?都有哪些方案?

1.codis

目前用的最多的集羣方案,基本和 twemproxy 一致的效果,但它支持在 節點數量改變狀況下,舊節點數據可恢復到新 hash 節點。

2.redis cluster3.0 自帶的集羣,特色在於他的分佈式算法不是一致性 hash,而是 hash 槽的概念,以及自身支持節點設置從節點。具體看官方文檔介紹。

3.在業務代碼層實現,起幾個毫無關聯的 redis 實例,在代碼層,對 key 進行 hash 計算,而後去對應的 redis 實例操做數據。  這種方式對 hash 層代碼要求比較高,考慮部分包括,節點失效後的替代算法方案,數據震盪後的自動腳本恢復,實例的監控,等等。

 

11Redis 集羣方案什麼狀況下會致使整個集羣不可用?

ABC 三個節點的集羣,在沒有複製模型的狀況下,若是節點 B 失敗了,那麼整個集羣就會覺得缺乏 5501-11000 這個範圍的槽而不可用。

 

12MySQL 裏有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis中的數據都是熱點數據?

redis 內存數據集大小上升到必定大小的時候,就會施行數據淘汰策略。

 

13Redis 有哪些適合的場景?

1)會話緩存(Session Cache

最經常使用的一種使用 Redis 的情景是會話緩存(session cache)。用 Redis 緩存會話比其餘存儲(如 Memcached)的優點在於:Redis 提供持久化。當維護一個不是嚴格要求一致性的緩存時,若是用戶的購物車信息所有丟失,大部分人都會不高興的,如今,他們還會這樣嗎?幸運的是,隨着 Redis 這些年的改進,很容易找到怎麼恰當的使用 Redis 來緩存會話的文檔。甚至廣爲人知的商業平臺 Magento 也提供 Redis 的插件。

2)全頁緩存(FPC

除基本的會話 token 以外,Redis 還提供很簡便的 FPC 平臺。回到一致性問題,即便重啓了 Redis 實例,由於有磁盤的持久化,用戶也不會看到頁面加載速度的降低,這是一個極大改進,相似 PHP 本地 FPC。再次以 Magento 爲例,Magento 提供一個插件來使用 Redis 做爲全頁緩存後端。

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

3)隊列

Reids 在內存存儲引擎領域的一大優勢是提供 list set 操做,這使得 Redis 能做爲一個很好的消息隊列平臺來使用。Redis 做爲隊列使用的操做,就相似於本地程序語言(如 Python)對 list push/pop操做。若是你快速的在 Google 中搜索「Redis queues」,你立刻就能找到大量的開源項目,這些項目的目的就是利用 Redis 建立很是好的後端工具,以知足各類隊列需求。例如,Celery 有一個後臺就是使用 Redis 做爲 broker,你能夠從這裏去查看。

4)排行榜/計數器

Redis 在內存中對數字進行遞增或遞減的操做實現的很是好。集合(Set)和有序集合(Sorted  Set)也使得咱們在執行這些操做的時候變的很是簡單,Redis 只是正好提供了這兩種數據結構。

因此,咱們要從排序集合中獲取到排名最靠前的 10 個用戶咱們稱之爲「user_scores」,咱們只須要像下面同樣執行便可:

固然,這是假定你是根據你用戶的分數作遞增的排序。若是你想返回用戶及用戶的分數,你須要這樣執行:ZRANGE user_scores 0 10 WITHSCORES Agora  Games 就是一個很好的例子,用 Ruby 實現的,它的排行榜就是使用 Redis 來存儲數據的,你能夠在這裏看到。

5)發佈/訂閱

最後(但確定不是最不重要的)是 Redis 的發佈/訂閱功能。發佈/訂閱的使用場景確實很是多。我已看見人們在社交網絡鏈接中使用,還可做爲基於發佈/訂閱的腳本觸發器,甚至用 Redis 的發佈/訂閱功能來創建聊天系統!

 

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

RedissonJedislettuce 等等,官方推薦使用 Redisson

 

15Redis Redisson 有什麼關係?

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

 

16Jedis Redisson 對比有什麼優缺點?

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

Redisson 實現了分佈式和可擴展的 Java 數據結構,和 Jedis 相比,功能較爲簡單,不支持字符串操做,不支持排序、事務、管道、分區等 Redis 特性。Redisson 的宗旨是促進使用者對 Redis 的關注分離,從而讓使用者可以將精力更集中地放在處理業務邏輯上。

 

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

設置密碼:config set requirepass 123456

受權密碼:auth 123456

 

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

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

 

19Redis 集羣的主從複製模型是怎樣的?

爲了使在部分節點失敗或者大部分節點沒法通訊的狀況下集羣仍然可用,因此集羣使用了主從複製模型,每一個節點都會有 N-1 個複製品.

 

20Redis 集羣會有寫操做丟失嗎?爲何?

Redis 並不能保證數據的強一致性,這意味這在實際中集羣在特定的條件下可能會丟失寫操做。

 

21Redis 集羣之間是如何複製的?

異步複製

22Redis 集羣最大節點個數是多少?

16384 個。

 

23Redis 集羣如何選擇數據庫?

Redis 集羣目前沒法作數據庫選擇,默認在 0 數據庫。

 

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

ping

 

25Redis 中的管道有什麼用?

一次請求/響應服務器能實現處理新的請求即便舊的請求還未被響應。這樣就能夠將多個命令發送到服務器,而不用等待回覆,最後在一個步驟中讀取該答覆。這就是管道(pipelining),是一種幾十年來普遍使用的技術。例如許多 POP3 協議已經實現支持這個功能,大大加快了從服務器下載新郵件的過程。

 

26、怎麼理解 Redis 事務?

事務是一個單獨的隔離操做:事務中的全部命令都會序列化、按順序地執行。事務在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷。事務是一個原子操做:事務中的命令要麼所有被執行,要麼所有都不執行。

 

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

MULTIEXECDISCARDWATCH

 

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

EXPIRE PERSIST 命令。

 

29Redis 如何作內存優化?

儘量使用散列表(hashes),散列表(是說散列表裏面存儲的數少)使用的內存很是小,因此你應該儘量的將你的數據模型抽象到一個散列表裏面。好比你的 web 系統中有一個用戶對象,不要爲這個用戶的名稱,姓氏,郵箱,密碼設置單獨的 key,而是應該把這個用戶的全部信息存儲到一張散列表裏面。

 

30Redis 回收進程如何工做的?

一個客戶端運行了新的命令,添加了新的數據。Redi 檢查內存使用狀況,若是大於 maxmemory 的限制, 則根據設定好的策略進行回收。

一個新的命令被執行,等等。因此咱們不斷地穿越內存限制的邊界,經過不斷達到邊界而後不斷地回收回到邊界如下。若是一個命令的結果致使大量內存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內存限制就會被這個內存使用量超越。

相關文章
相關標籤/搜索