分享30道Redis面試題,面試官能問到的我都找到了

============================================================================

轉自:https://www.cnblogs.com/lfs2640666960/p/9700706.html

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

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

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

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

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

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

2、Redis相比memcached有哪些優勢?

(1) memcached所有的值均是簡單的字符串,redis作爲其替代者,支持更爲豐富的數據類型

(2) redis的速度比memcached快很多

(3) redis可以持久化其數據

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

String、List、Set、Sorted Set、hashes

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

內存。

5、Redis的全稱是什麼?

Remote Dictionary Server。

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

noeviction:返回錯誤當內存限制達到並且客戶端嘗試執行會讓更多內存被使用的命令(大部分的寫入指令,但DEL和幾個例外)

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

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

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

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

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

7、Redis官方爲什麼不提供Windows版本?

因爲目前Linux版本已經相當穩定,而且用戶量很大,無需開發windows版本,反而會帶來兼容性等問題。

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

512M

9、爲什麼Redis需要把所有數據放到內存中?

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

所以redis具有快速和數據持久化的特徵。如果不將數據放在內存中,磁盤I/O速度爲嚴重影響redis的性能。

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

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

1.codis。

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

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

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

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

有A,B,C三個節點的集羣,在沒有複製模型的情況下,如果節點B失敗了,那麼整個集羣就會以爲缺少5501-11000這個範圍的槽而不可用。

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

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

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

(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的發佈/訂閱功能來建立聊天系統!

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

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

15、Redis和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)。

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

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

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

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

設置密碼:config set requirepass 123456

授權密碼:auth 123456

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

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

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

爲了使在部分節點失敗或者大部分節點無法通信的情況下集羣仍然可用,所以集羣使用了主從複製模型,每個節點都會有N-1個複製品.

20、Redis集羣會有寫操作丟失嗎?爲什麼?

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

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

異步複製

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

16384個。

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

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

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

ping

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

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

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

26、怎麼理解Redis事務?

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

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

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

MULTI、EXEC、DISCARD、WATCH

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

EXPIRE和PERSIST命令。

29、Redis如何做內存優化?

儘可能使用散列表(hashes),散列表(是說散列表裏面存儲的數少)使用的內存非常小,所以你應該儘可能的將你的數據模型抽象到一個散列表裏面。

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

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

一個客戶端運行了新的命令,添加了新的數據。

Redi檢查內存使用情況,如果大於maxmemory的限制, 則根據設定好的策略進行回收。

一個新的命令被執行,等等。

所以我們不斷地穿越內存限制的邊界,通過不斷達到邊界然後不斷地回收回到邊界以下。

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

========================================================================================

轉自:https://www.cnblogs.com/hwisecn/p/5912374.html

1. 使用redis有哪些好處?

(1) 速度快,因爲數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)

(2) 支持豐富數據類型,支持string,list,set,sorted set,hash

(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行

(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

 

2. redis相比memcached有哪些優勢?

(1) memcached所有的值均是簡單的字符串,redis作爲其替代者,支持更爲豐富的數據類型

(2) redis的速度比memcached快很多

(3) redis可以持久化其數據

 

3. redis常見性能問題和解決方案:

(1) Master最好不要做任何持久化工作,如RDB內存快照和AOF日誌文件

(2) 如果數據比較重要,某個Slave開啓AOF備份數據,策略設置爲每秒同步一次

(3) 爲了主從複製的速度和連接的穩定性,Master和Slave最好在同一個局域網內

(4) 儘量避免在壓力很大的主庫上增加從庫

(5) 主從複製不要用圖狀結構,用單向鏈表結構更爲穩定,即:Master <- Slave1 <- Slave2 <- Slave3...

這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啓用Slave1做Master,其他不變。

 

 

 

4. mySQL裏有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據

 相關知識:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。redis 提供 6種數據淘汰策略:

voltile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰

volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰

volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰

allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰

allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰

no-enviction(驅逐):禁止驅逐數據

 

5. Memcache與Redis的區別都有哪些?

1)、存儲方式

Memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。

Redis有部份存在硬盤上,這樣能保證數據的持久性。

2)、數據支持類型

Memcache對數據類型支持相對簡單。

Redis有複雜的數據類型。

3)、使用底層模型不同

它們之間底層實現方式 以及與客戶端之間通信的應用協議不一樣。

Redis直接自己構建了VM 機制 ,因爲一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。

4),value大小

redis最大可以達到1GB,而memcache只有1MB

 

 

6. Redis 常見的性能問題都有哪些?如何解決?

 

1).Master寫內存快照,save命令調度rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫內存快照。

 

2).Master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響Master重啓的恢復速度。Master最好不要做任何持久化工作,包括內存快照和AOF日誌文件,特別是不要啓用內存快照做持久化,如果數據比較關鍵,某個Slave開啓AOF備份數據,策略爲每秒同步一次。

 

3).Master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會佔大量的CPU和內存資源,導致服務load過高,出現短暫服務暫停現象。

4). Redis主從複製的性能問題,爲了主從複製的速度和連接的穩定性,Slave和Master最好在同一個局域網內

 

 

7, redis 最適合的場景

 

Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?

       如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:

     1 、Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
     2 、Redis支持數據的備份,即master-slave模式的數據備份。
     3 、Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啓的時候可以再次加載進行使用。

(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的發佈/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實)。

Redis提供的所有特性中,我感覺這個是喜歡的人最少的一個,雖然它爲用戶提供如果此多功能。

=============================================================================================

轉自:https://www.cnblogs.com/xiugeng/p/11041880.html

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

  Redis 的全稱是:Remote Dictionary.Server,本質上是一個 Key-Value 類型的內存數據庫,很像memcached,整個數據庫統統加載在內存當中進行操作,定期通過異步操作把數據庫數據 flush 到硬盤上進行保存。

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

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

  另外 Redis 也可以對存入的 Key-Value 設置 expire 時間,因此也可以被當作一 個功能加強版的memcached 來用。

  Redis 的主要缺點是數據庫容量受到物理內存的限制,不能用作海量數據的高性能讀寫,因此 Redis 適合的場景主要侷限在較小數據量的高性能操作和運算上。

2、Redis 與 memcached 相比有哪些優勢?

  memcached 所有的值均是簡單的字符串,redis 作爲其替代者,支持更爲豐富的數據類型。

  redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多。

  redis 可以持久化其數據。

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

  String、List、Set、Sorted Set、hashes。

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

  內存。

5、Redis 官方爲什麼不提供 Windows 版本?

  因爲目前 Linux 版本已經相當穩定,而且用戶量很大,無需開發 windows 版本,反而會帶來兼容性等問題。

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

  • noeviction:返回錯誤當內存限制達到,並且客戶端嘗試執行會讓更多內存被使用的命令。
  • allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的數據有空間存放。
  • volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限於在過期集合的鍵,使得新添加的數據有空間存放。
  • allkeys-random: 回收隨機的鍵使得新添加的數據有空間存放。
  • volatile-random: 回收隨機的鍵使得新添加的數據有空間存放,但僅限於在過期集合的鍵。
  • volatile-ttl: 回收在過期集合的鍵,並且優先回收存活時間(TTL)較短的鍵,使得新添加的數據有空間存放。

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

  512M。

8、爲什麼 Redis 需要把所有數據放到內存中?

  Redis 爲了達到最快的讀寫速度將數據都讀到內存中,並通過異步的方式將數據寫入磁盤。所以 redis 具有快速和數據持久化的特徵,如果不將數據放在內存中,磁盤 I/O 速度會嚴重影響 redis 的性能。

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

9、Redis 集羣方案應該怎麼做?都有哪些方案?

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

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

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

10、Redis 集羣方案什麼情況下會導致整個集羣不可用?

  有 A,B,C 三個節點的集羣,在沒有複製模型的情況下,如果節點 B 失敗了,那麼整個集羣就會以爲缺少5501-11000 這個範圍的槽而不可用。

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

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

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

  (1)會話緩存(Session Cache)

  最常用的使用Redis 的情景是會話緩存(sessioncache),用 Redis 緩存會話比其他存儲(如Memcached)的優勢在於:Redis 提供持久化。

  隨着Redis這些年的改進,很容易找到怎麼恰當的使用 Redis 來緩存會話的文檔。商業平臺 Magento 也提供 Redis 的插件。

  (2)全頁緩存(FPC)

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

  Magento 提供一個插件來使用 Redis 作爲全頁緩存後端。

  (3)隊列

  Redis 在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得 Redis 能作爲一個很好的消息隊列平臺來使用。

  Redis 作爲隊列使用的操作,類似於python對 list 的 push/pop 操作。搜索“Redis queue”可以找到大量的開源項目,這些項目的目的就是利用Redis 創建非常好的後端工具,以滿足各種隊列需求。

  (4)排行榜/計算器

  Redis 在內存中對數字進行遞增或遞減的操作實現得非常好。集合(Set)和有序集合(SortedSet)也使得我們在執行這些操作的時候變得非常簡單,Redis中僅提供這兩種數據結構。

  (5)發佈/訂閱

  Redis 的發佈/訂閱功能。可以在社交網絡連接中使用,還可作爲基於發佈/訂閱的腳本觸發器,甚至用 Redis 的發佈/訂閱功能來建立聊天系統。

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

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

14、Redis 和 Redisson 有什麼關係?

 

15、Jedis 與 Redisson 對比有什麼優缺點?

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

  Redisson 實現了分佈式和可擴展的 Java 數據結構,和 Jedis 相比,功能較簡單,不支持字符串操作,不支持排序、事務、管道、分區等 Redis 特性。

  Redisson 的宗旨是促進使用者對 Redis 的關注分離,從而讓使用者能將精力更集中地放在處理業務邏輯上。

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

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

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

  爲了使在部分節點失敗或者大部分節點無法通信的情況下集羣仍然可用,所以集羣使用了主從複製模型,每個節點都會有N-1個複製品。

18、Redis 集羣會有寫操作丟失嗎?爲什麼?

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

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

  異步複製。  

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

  16384個。

21、Redis 集羣如何選擇數據庫?

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

22、Redis 中的管道有什麼用?

  一次請求/響應服務器能實現處理新的請求即使舊的請求還未被響應,這樣就可以將多個命令發送到服務器,而不用等待回覆,最後在一個步驟中讀取該答覆。這就是管道(pipelining),是一種幾十年來廣泛使用的技術。

  例如許多 POP3 協議已經實現支持這個功能,大大加快了從服務器下載新郵件的過程。

23、怎麼理解 Redis 事務?

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

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

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

  MULTI、EXEC、DISCARD、WATCH。

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

  EXPIRE 和 PERSIST 命令。

26、Redis 如何做內存優化?

  儘可能使用散列表(hashes),散列表使用的內存非常小,所以應儘可能將數據模型抽象到一個散列表內。

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

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

  一個客戶端運行了新的命名,添加了新的數據。Redis 檢查內存使用情況,如果大於maxmemory的限制,則根據設定好的策略進行回收。

  不斷地穿越內存限制的邊界,通過不斷達到邊界然後不斷地回收回到邊界一下。如果一個命令導致大量內存被使用,不用多久內存限制就會被內存使用量超越。

28、加鎖機制

 

29、鎖互斥機制

 

30、watch dog自動延期機制

 

31、可重入加鎖機制

 

32、釋放鎖機制

 

33、上述Redis分佈式鎖的缺點

 

34、使用過 Redis 分佈式鎖嗎?它是怎麼實現的?

  先用setnx來爭搶鎖,搶到後,再用expire給鎖加一個過期時間防止鎖忘記釋放。

  若在setnx之後執行expire之前進程以外crash或者重啓維護會如何?

  set 指令有非常複雜的參數,這個可以同時把setnx和expire合成一條指令來使用。

35、使用過 Redis 做異步隊列嗎?如何使用?什麼缺點?

  使用list結構作爲隊列,rpush生成消息,lpop消費消息。當lpop沒有消息時,要適當sleep一會再重試。

  缺點:

    在消費者下線的情況下,生成的消息會丟失,得使用專業的消息隊列如 rabbitmq等。

    不能生產一次消費多次

    使用pub/sub主題訂閱者模式,可以實現1:N的消息隊列。

36、什麼是緩存穿透?如何避免?什麼是緩存雪崩?如何避免?

緩存穿透:

  一般的緩存系統,都是按照key去緩存查詢,如果不存在對應的value,就應該去後端系統查找(比如DB)。一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力。這就叫做緩存穿透。

緩存穿透避免:

  1.對查詢結果爲空的情況也進行緩存,緩存時間設置短一點,或者該key對應的數據insert之後清理緩存。

  2.對一定不存在的key進行過濾,可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。

緩存雪崩:

  當緩存服務器重啓或者大量緩存集中在某一個時間段失效,這樣在失效的時候,會給後端系統帶來很大的壓力。導致系統崩潰。

緩存雪崩避免:

  1.緩存失效後,通過加鎖或隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。

  2.做二級緩存,A1爲原始緩存,A2爲拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設置爲短期,A2設置爲長期;

  3.不同的key,設置不同的過期時間,讓緩存失效的時間點儘量均勻。

37、redis 和 memcached什麼區別?爲什麼高併發下有時單線程的redis比多線程的memcached效率要高?

 

38、使用 redis 如何設計分佈式鎖?說一下實現思路?使用zk可否實現?兩種方式有什麼區別?

 

39、知道 redis 的持久化嗎?底層是如何實現的?有什麼優點缺點?

 

40、緩存穿透、緩存擊穿、緩存雪崩解決方案?

 

41、在選擇緩存時,什麼時候選擇 redis,什麼時候選擇memcached?

 

42、Redis常見的性能問題和解決方案?

 

43、Redis的數據淘汰策略有哪些?

 

44、Redis當中有哪些數據結構?

 

45、使用 Redis 做過異步隊列嗎?是如何實現的?

 

46、Redis 如何實現延時隊列?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章