Redis面試題及答案 【最新版】Redis面試題大全,發現網上很多Redis面試題及答案整理都沒有答案,所以花了很長時間搜集,本套Redis面試題大全
如果不背 Redis面試題的答案,肯定面試會掛!
這套Redis面試題大全,希望對大家有幫助哈~
博主已將以下這些面試題整理成了一個面試手冊,是PDF版的
1、Redis持久化策略選擇
1、 如果Redis中的數據完全丟棄也沒有關系(如Redis完全用作DB層數據的cache),那么無論是單機,還是主從架構,都可以不進行任何持久化。
2、 在單機環境下(對於個人開發者,這種情況可能比較常見),如果可以接受十幾分鍾或更多的數據丟失,選擇RDB對Redis的性能更加有利;如果只能接受秒級別的數據丟失,應該選擇AOF。
3、 但在多數情況下,我們都會配置主從環境,slave的存在既可以實現數據的熱備,也可以進行讀寫分離分擔Redis讀請求,以及在master宕掉后繼續提供服務。
2、Redis常見性能問題和解決方案:
1、 Master最好不要寫內存快照,如果Master寫內存快照,save命令調度rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務
2、 如果數據比較重要,某個Slave開啟AOF備份數據,策略設置為每秒同步一
3、 為了主從復制的速度和連接的穩定性,Master和Slave最好在同一個局域網
4、 盡量避免在壓力很大的主庫上增加從
5、 主從復制不要用圖狀結構,用單向鏈表結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3…這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。
3、Redis修改配置不重啟Redis會實時生效嗎?
針對運行實例,有許多配置選項可以通過 CONFIG SET 命令進行修改,而無需執行任何形式的重啟。 從 Redis 2.2 開始,可以從 AOF 切換到 RDB 的快照持久性或其他方式而不需要重啟 Redis。檢索 ‘CONFIG GET *’ 命令獲取更多信息。
但偶爾重新啟動是必須的,如為升級 Redis 程序到新的版本,或者當你需要修改某些目前 CONFIG 命令還不支持的配置參數的時候。
4、Redis過期鍵的刪除策略?
1、 定時刪除:在設置鍵的過期時間的同時,創建一個定時器timer)、讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作。
2、 惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。
3、 定期刪除:每隔一段時間程序就對數據庫進行一次檢查,刪除里面的過期鍵。至於要刪除多少過期鍵,以及要檢查多少個數據庫,則由算法決定。
5、Redis與Memcached相比有哪些優勢?
1、 Memcached所有的值均是簡單的字符串,Redis作為其替代者,支持更為豐富的數據類型
2、 Redis的速度比Memcached快很多Redis的速度比Memcached快很多
3、 Redis可以持久化其數據Redis可以持久化其數據
6、Redis持久化的幾種方式
1、 快照(snapshots)
缺省情況情況下,Redis把數據快照存放在磁盤上的二進制文件中,文件名為dump.rdb。你可以配置Redis的持久化策略,例如數據集中每N秒鍾有超過M次更新,就將數據寫入磁盤;或者你可以手工調用命令SAVE或BGSAVE。
工作原理
- Redis forks.
- 子進程開始將數據寫到臨時RDB文件中。
- 當子進程完成寫RDB文件,用新文件替換老文件。
- 這種方式可以使Redis使用copy-on-write技術。
2、 AOF
快照模式並不十分健壯,當系統停止,或者無意中Redis被kill掉,最后寫入Redis的數據就會丟失。
這對某些應用也許不是大問題,但對於要求高可靠性的應用來說,Redis就不是一個合適的選擇。Append-only文件模式是另一種選擇。你可以在配置文件中打開AOF模式
3、 虛擬內存方式
當你的key很小而value很大時,使用VM的效果會比較好.因為這樣節約的內存比較大.
當你的key不小時,可以考慮使用一些非常方法將很大的key變成很大的value,比如你可以考慮將key,value組合成一個新的value.
vm-max-threads這個參數,可以設置訪問swap文件的線程數,設置最好不要超過機器的核數,如果設置為0,那么所有對swap文件的操作都是串行的.可能會造成比較長時間的延遲,但是對數據完整性有很好的保證.
自己測試的時候發現用虛擬內存性能也不錯。如果數據量很大,可以考慮分布式或者其他數據庫。
7、為什么Redis需要把所有數據放到內存中?
Redis為了達到最快的讀寫速度將數據都讀到內存中,並通過異步的方式將數據寫入磁盤。
所以Redis具有快速和數據持久化的特征,如果不將數據放在內存中,磁盤I/O速度為嚴重影響Redis的性能。
在內存越來越便宜的今天,Redis將會越來越受歡迎, 如果設置了最大使用的內存,則數據已有記錄數達到內存限值后不能繼續插入新值。
8、Redis集群方案應該怎么做?都有哪些方案?
1、 codis。
目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 節點數量改變情況下,舊節點數據可恢復到新hash節點。
2、 Redis cluster3.0自帶的集群,特點在於他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持節點設置從節點。具體看官方文檔介紹。
3、 在業務代碼層實現,起幾個毫無關聯的Redis實例,在代碼層,對key 進行hash計算,然后去對應的Redis實例操作數據。 這種方式對hash層代碼要求比較高,考慮部分包
9、Redis 的回收策略(淘汰策略)
volatile-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( 驅逐) : 禁止驅逐數據
注意這里的 6 種機制,volatile 和 allkeys 規定了是對已設置過期時間的數據集淘汰數據還是從全部數據集淘汰數據, 后面的 lru、ttl 以及 random 是三種不同的淘汰策略, 再加上一種 no-enviction 永不回收的策略。
使用策略規則:
1、 如果數據呈現冪律分布,也就是一部分數據訪問頻率高,一部分數據訪問頻率 低, 則使用 allkeys-lru
2、 如果數據呈現平等分布, 也就是所有的數據訪問頻率都相同, 則使用allkeys-random
10、AOF常用配置總結
下面是AOF常用的配置項,以及默認值;前面介紹過的這里不再詳細介紹。
1、 appendonly no:是否開啟AOF
2、 appendfilename "appendonly.aof":AOF文件名
3、 dir ./:RDB文件和AOF文件所在目錄
4、 appendfsync everysec:fsync持久化策略
5、 no-appendfsync-on-rewrite no:AOF重寫期間是否禁止fsync;如果開啟該選項,可以減輕文件重寫時CPU和硬盤的負載(尤其是硬盤),但是可能會丟失AOF重寫期間的數據;需要在負載和安全性之間進行平衡
6、 auto-aof-rewrite-percentage 100:文件重寫觸發條件之一
7、 auto-aof-rewrite-min-size 64mb:文件重寫觸發提交之一
8、 aof-load-truncated yes:如果AOF文件結尾損壞,Redis啟動時是否仍載入AOF文件
11、都有哪些辦法可以降低 Redis 的內存使用情況呢?
如果你使用的是 32 位的 Redis 實例,可以好好利用 Hash,list,sorted set,set 等集合類型數據, 因為通常情況下很多小的 Key-Value 可以用更緊湊的方式存放到一起。
12、Redis有哪些適合的場景?
會話緩存(Session Cache)
最常用的一種使用Redis的情景是會話緩存(sessioncache),用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?
幸運的是,隨着 Redis 這些年的改進,很容易找到怎么恰當的使用Redis來緩存會話的文檔。甚至廣為人知的商業平台Magento也提供Redis的插件。
全頁緩存(FPC)
除基本的會話token之外,Redis還提供很簡便的FPC平台。回到一致性問題,即使重啟了Redis實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC。
再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存后端。
此外,對WordPress的用戶來說,Pantheon有一個非常好的插件wp-Redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。
隊列
Reids在內存存儲引擎領域的一大優點是提供list和set操作,這使得Redis能作為一個很好的消息隊列平台來使用。Redis作為隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。
如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創建非常好的后端工具,以滿足各種隊列需求。例如,Celery有一個后台就是使用Redis作為broker,你可以從這里去查看。
排行榜/計數器
Redis在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(SortedSet)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數據結構。
所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執行即可:
當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來存儲數據的,你可以在這里看到。
發布/訂閱
最后(但肯定不是最不重要的)是Redis的發布/訂閱功能。發布/訂閱的使用場景確實非常多。我已看見人們在社交網絡連接中使用,還可作為基於發布/訂閱的腳本觸發器,甚至用Redis的發布/訂閱功能來建立聊天系統!
13、是否使用過Redis集群,集群的原理是什么?
1、 Redis Sentinal着眼於高可用,在master宕機時會自動將slave提升為master,繼續提供服務。
2、 Redis Cluster着眼於擴展性,在單個Redis內存不足時,使用Cluster進行分片存儲。
14、Redis如何做內存優化?
盡可能使用散列表(hashes),散列表(是說散列表里面存儲的數少)使用的內存非常小,所以你應該盡可能的將你的數據模型抽象到一個散列表里面。比如你的web系統中有一個用戶對象,不要為這個用戶的名稱,姓氏,郵箱,密碼設置單獨的key,而是應該把這個用戶的所有信息存儲到一張散列表里面.
15、Redis集群方案應該怎么做?都有哪些方案?
1、 twemproxy,大概概念是,它類似於一個代理方式,使用方法和普通Redis無任何區別,設置好它下屬的多個Redis實例后,使用時在本需要連接Redis的地方改為連接twemproxy,它會以一個代理的身份接收請求並使用一致性hash算法,將請求轉接到具體Redis,將結果再返回twemproxy。使用方式簡便(相對Redis只需修改連接端口),對舊項目擴展的首選。 問題:twemproxy自身單端口實例的壓力,使用一致性hash后,對Redis節點數量改變時候的計算值的改變,數據無法自動移動到新的節點。
2、 codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 節點數量改變情況下,舊節點數據可恢復到新hash節點。
3、 Redis cluster3.0自帶的集群,特點在於他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持節點設置從節點。具體看官方文檔介紹。
4、 在業務代碼層實現,起幾個毫無關聯的Redis實例,在代碼層,對key 進行hash計算,然后去對應的Redis實例操作數據。 這種方式對hash層代碼要求比較高,考慮部分包括,節點失效后的替代算法方案,數據震盪后的自動腳本恢復,實例的監控,等等。
16、怎么測試Redis的連通性?
使用ping命令。
17、Redis的並發競爭問題如何解決?
Redis為單進程單線程模式,采用隊列模式將並發訪問變為串行訪問。Redis本身沒有鎖的概念,Redis對於多個客戶端連接並不存在競爭,但是在Jedis客戶端對Redis進行並發訪問時會發生連接超時、數據轉換錯誤、阻塞、客戶端關閉連接等問題,這些問題均是由於客戶端連接混亂造成。
對此有2種解決方法:
1、 客戶端角度,為保證每個客戶端間正常有序與Redis進行通信,對連接進行池化,同時對客戶端讀寫Redis操作采用內部鎖synchronized。
2、 服務器角度,利用setnx實現鎖。
注:對於第一種,需要應用程序自己處理資源的同步,可以使用的方法比較通俗,可以使用synchronized也可以使用lock;第二種需要用到Redis的setnx命令,但是需要注意一些問題。
18、使用Redis 有哪些好處?
1、 速度快, 因為數據存在內存中, 類似於 HashMap, HashMap 的優勢就是查找和操作的時間復雜度都是 O1)
2、 支持豐富數據類型, 支持 string, list, set, Zset, hash 等
3、 支持事務, 操作都是原子性, 所謂的原子性就是對數據的更改要么全部執行, 要么全部不執行
4、 豐富的特性:可用於緩存,消息,按 key 設置過期時間,過期后將會自動刪除
19、Redis回收進程如何工作的?
一個客戶端運行了新的命令,添加了新的數據。Redi檢查內存使用情況,如果大於maxmemory的限制, 則根據設定好的策略進行回收。一個新的命令被執行,等等。所以我們不斷地穿越內存限制的邊界,通過不斷達到邊界然后不斷地回收回到邊界以下。如果一個命令的結果導致大量內存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內存限制就會被這個內存使用量超越。
20、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的發布/訂閱功能來建立聊天系統!
21、Redis 開啟AOF
Redis服務器默認開啟RDB,關閉AOF;要開啟AOF,需要在配置文件中配置:
appendonly yes
22、Redis集群的主從復制模型是怎樣的?
為了使在部分節點失敗或者大部分節點無法通信的情況下集群仍然可用,所以集群使用了主從復制模型,每個節點都會有N-1個復制品.
23、Redis相比Memcached有哪些優勢?
1、 Memcached所有的值均是簡單的字符串,Redis作為其替代者,支持更為豐富的數據類
2、 Redis的速度比Memcached快很
3、 Redis可以持久化其數據
24、什么是Redis?
Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。
Redis 與其他 key - value 緩存產品有以下三個特點:
1、 Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
2、 Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
3、 Redis支持數據的備份,即master-slave模式的數據備份。
Redis 優勢
1、 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
2、 豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
3、 原子 – Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
4、 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Redis與其他key-value存儲有什么不同?
Redis有着更為復雜的數據結構並且提供對他們的原子性操作,這是一個不同於其他數據庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。
Redis運行在內存中但是可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大於硬件內存。在內存數據庫方面的另一個優點是,相比在磁盤上相同的復雜的數據結構,在內存中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。
25、Redis相比Memcached有哪些優勢?
1、 Memcached所有的值均是簡單的字符串,Redis作為其替代者,支持更為豐富的數據類型
2、 Redis的速度比Memcached快很多
3、 Redis可以持久化其數據
26、怎么測試 Redis 的連通性?
使用 ping 命令。
27、Redis 過期鍵的刪除策略?
1、 定時刪除:在設置鍵的過期時間的同時,創建一個定時器 timer). 讓定時器在鍵的過期時間來臨時, 立即執行對鍵的刪除操作。
2、 惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是 否過期, 如果過期的話, 就刪除該鍵;如果沒有過期, 就返回該鍵。
3、 定期刪除:每隔一段時間程序就對數據庫進行一次檢查,刪除里面的過期鍵。至 於要刪除多少過期鍵, 以及要檢查多少個數據庫, 則由算法決定。
28、Redis對象有5種類型
無論是哪種類型,Redis都不會直接存儲,而是通過RedisObject對象進行存儲。
29、Redis中海量數據的正確操作方式
利用SCAN系列命令(SCAN、SSCAN、HSCAN、ZSCAN)完成數據迭代。
30、Redis事物的了解CAS(check-and-set 操作實現樂觀鎖 )?
和眾多其它數據庫一樣,Redis作為NoSQL數據庫也同樣提供了事務機制。在Redis中,MULTI/EXEC/DISCARD/WATCH這四個命令是我們實現事務的基石。
相信對有關系型數據庫開發經驗的開發者而言這一概念並不陌生,即便如此,我們還是會簡要的列出Redis中事務的實現特征:
1、 在事務中的所有命令都將會被串行化的順序執行,事務執行期間,Redis不會再為其它客戶端的請求提供任何服務,從而保證了事物中的所有命令被原子的執行。
2、 和關系型數據庫中的事務相比,在Redis事務中如果有某一條命令執行失敗,其后的命令仍然會被繼續執行。
3、 我們可以通過MULTI命令開啟一個事務,有關系型數據庫開發經驗的人可以將其理解為"BEGIN TRANSACTION"語句。在該語句之后執行的命令都將被視為事務之內的操作,最后我們可以通過執行EXEC/DISCARD命令來提交/回滾該事務內的所有操作。這兩個Redis命令可被視為等同於關系型數據庫中的COMMIT/ROLLBACK語句。
4、 在事務開啟之前,如果客戶端與服務器之間出現通訊故障並導致網絡斷開,其后所有待執行的語句都將不會被服務器執行。然而如果網絡中斷事件是發生在客戶端執行EXEC命令之后,那么該事務中的所有命令都會被服務器執行。
5、 當使用Append-Only模式時,Redis會通過調用系統函數write將該事務內的所有寫操作在本次調用中全部寫入磁盤。然而如果在寫入的過程中出現系統崩潰,如電源故障導致的宕機,那么此時也許只有部分數據被寫入到磁盤,而另外一部分數據卻已經丟失。
Redis服務器會在重新啟動時執行一系列必要的一致性檢測,一旦發現類似問題,就會立即退出並給出相應的錯誤提示。
此時,我們就要充分利用Redis工具包中提供的Redis-check-aof工具,該工具可以幫助我們定位到數據不一致的錯誤,並將已經寫入的部分數據進行回滾。修復之后我們就可以再次重新啟動Redis服務器了。
更多 Redis面試題及答案 70道
01、一個Redis實例最多能存放多少的keys?List、Set、Sorted Set他們最多能存放多少元素?
03、定時刪除
04、怎么理解Redis事務?
05、什么是Redis?
06、Redis分布式鎖實現
07、Redis做異步隊列
12、MySQL里有2000w數據,Redis中只存20w的數據
13、Reids6種淘汰策略:
15、Pipeline 有什么好處,為什么要用pipeline?
18、刪除key
21、MySQL里有2000w數據,Redis中只存20w的數據,如何保證Redis中的數據都是熱點數據?
23、mySQL里有2000w數據,Redis中只存20w的數據,如何保證Redis中的數據都是熱點數據
26、,或是關注
27、怎么理解Redis事務?
28、Redis key 的過期時間和永久有效分別怎么設置?
32、Pipeline有什么好處,為什么要用pipeline?
33、Redis常用管理命令
40、List、Set、Sorted Set 他們最多能存放多少元素?
42、Reids支持的語言:
47、AOF常用配置總結
51、一個Redis實例最多能存放多少的keys?List、Set、Sorted Set他們最多能存放多少元素?
53、定時刪除
54、怎么理解Redis事務?
55、什么是Redis?
56、Redis分布式鎖實現
57、Redis做異步隊列
62、Reids的特點
63、Redis最適合的場景?
68、假如Redis里面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的,如果將它們全部找出來?
如果不背 Redis面試題的答案,肯定面試會掛!