Redis面試題(2021最新版)

前言

做爲一個後端開發人員,不僅是要求開發人員須要掌握 Redis,也要求運維人員也要懂 Redis。因爲 Redis 的運用普遍,咱們也知道它的重要性,至此面試中常常被問到。在這 80道 Redis 面試題中,考察知識點包括基礎、數據結構指令、高併發處理、持久化、集羣、複製、Redis 應用等。若是你最近在準備面試或者在學習 Redis,我相信本次小編能夠知足你的面試須要。也但願我花了半個月整理的這些題目,解答對你有所幫助。java

小編分享的這份金三銀四Java後端開發面試總結包含了JavaOOP、Java集合容器、Java異常、併發編程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL數據庫、消息中間件MQ、Dubbo、Linux、ZooKeeper、 分佈式&數據結構與算法等26個專題技術點,都是小編在各個大廠總結出來的面試真題,已經有不少粉絲靠這份PDF拿下衆多大廠的offer,今天在這裏總結分享給到你們!【持續更新中!】web

完整版Java面試題地址:2021最新面試題合集集錦面試

序號 專題 內容 連接
1 中間件 Java中間件面試題(2021最新版) https://blog.51cto.com/14994509/2692669
2 微服務 Java微服務面試題(2021最新版) http://www.javashuo.com/article/p-haiifnkb-vk.html
3 併發編程 Java併發編程面試題(2021最新版) http://www.javashuo.com/article/p-rirekprn-vk.html
4 Java基礎 Java基礎知識面試題(2021最新版) https://blog.51cto.com/blogger/success/2706687
5 Spring Boot Spring Boot面試題(2021最新版) http://www.javashuo.com/article/p-etpzmprr-vk.html
6 Redis Redis面試題(2021最新版) 持續更新中!
7 Spring MVC Spring MVC面試題(2021最新版) 持續更新中!
8 Spring Cloud Spring Cloud面試題(2021最新版) 持續更新中!
9 MySQL優化 MySQL優化面試題(2021最新版) 持續更新中!
10 JVM JVM性能調優面試題(2021最新版) 持續更新中!
11 Linux Linux面試題(2021最新版) 持續更新中!
12 Mybatis Mybatis面試題(2021最新版) 持續更新中!
13 網絡編程 TCP,UDP,Socket,Http網絡編程面試題(2021最新版) 持續更新中!
14 設計模式 設計模式面試題(2021最新版) 持續更新中!
15 大數據 大數據面試題100道(2021最新版) 持續更新中!
16 Tomcat Tomcat面試題(2021最新版) 持續更新中!
17 多線程 多線程面試題(2021最新版) 持續更新中!
18 Nginx Nginx_BIO_NIO_AIO面試題(2021最新版) 持續更新中!
19 memcache memcache面試題(2021最新版) 持續更新中!
20 java異常 java異常面試題(2021最新版) 持續更新中!
21 Java虛擬機 Java虛擬機面試題(2021最新版) 持續更新中!
22 Java集合 Java集合面試題(2021最新版) 持續更新中!
23 Git經常使用命令 Git經常使用命令(2021最新版) 持續更新中!
24 Elasticsearch Elasticsearch面試題(2021最新版) 持續更新中!
25 Dubbo Dubbo面試題(2021最新版) 持續更新中!

一、什麼是 Redis?

Redis 是一個使用 C 語言寫成的,開源的高性能key-value非關係緩存數據庫。它支持存儲的value 類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和 hash(哈希類型)。Redis的數據都基於緩存的,因此很快,每秒能夠處理超過 10萬次讀寫操做,是已知性能最快的Key-Value DB。Redis也能夠實現數據寫入磁盤中,保證了數據的安全不丟 失,並且Redis的操做是原子性的。redis

二、Redis 的數據類型?

Redis主要有5種數據類型,包括String,List,Set,Zset,Hash,知足大部分的使用要求算法

Redis面試題(2021最新版)

三、使用 Redis 有哪些好處?

(1) 速度快,由於數據存在內存中,相似於HashMap,HashMap的優點就是查找和操做的時間復 數據庫

雜度都很低 編程

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

(3) 支持事務,操做都是原子性,所謂的原子性就是對數據的更改要麼所有執行,要麼所有不執行 設計模式

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

四、Redis 相比 Memcached 有哪些優點?

  • 一、Memcached 全部的值均是簡單的字符串, redis 做爲其替代者, 支持更爲豐富的數據類
  • 二、Redis 的速度比 Memcached 快很三、Redis 能夠持久化其數據

五、Memcache 與 Redis 的區別都有哪些?

一、存儲方式 Memecache 把數據所有存在內存之中, 斷電後會掛掉, 數據不能超過內存大小。 Redis有部份存在硬盤上, 這樣能保證數據的持久性

二、數據支持類型 Memcache 對數據類型支持相對簡單。 Redis 有複雜的數據類型。

三、使用底層模型不一樣 它們之間底層實現方式 以及與客戶端之間通訊的應用協議不同。 Redis 直接本身構建了 VM 機制 ,由於通常的系統調用系統函數的話, 會浪費必定的時間去移動和請求。

六、Redis 是單進程單線程的?

  • 答: Redis 是單進程單線程的, redis 利用隊列技術將併發訪問變爲串行訪問, 消除了傳統數據庫串行控制的開銷。

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

  • 答: 512M

八、Redis 的持久化機制是什麼?各自的優缺點?

Redis 提供兩種持久化機制 RDB(默認) 和 AOF 機制:

RDB:是Redis DataBase縮寫快照

  • RDB是Redis默認的持久化方式。按照必定的時間將內存的數據以快照的形式保存到硬盤中,對應產生的數據文件爲dump.rdb。經過配置文件中的save參數來定義快照的週期。

Redis面試題(2021最新版)

優勢:

  1. 只有一個文件 dump.rdb,方便持久化。
  2. 容災性好,一個文件能夠保存到安全的磁盤。
  3. 性能最大化,fork 子進程來完成寫操做,讓主進程繼續處理命令,因此是 IO 最大化。使用單 獨子進程來進行持久化,主進程不會進行任何 IO 操做,保證了 redis 的高性能
  4. 相對於數據集大時,比 AOF 的啓動效率更高。

缺點:

  1. 數據安全性低。RDB 是間隔一段時間進行持久化,若是持久化之間 redis 發生故障,會發生數 據丟失。因此這種方式更適合數據要求不嚴謹的時候)
  2. AOF(Append-only fifile)持久化方式: 是指全部的命令行記錄以 redis 命令請 求協議的格式 徹底持久化存儲)保存爲 aof 文件。

AOF:持久化:

  • AOF持久化(即Append Only File持久化),則是將Redis執行的每次寫命令記錄到單獨的日誌文件
  • 中,當重啓Redis會從新將持久化的日誌中文件恢復數據。當兩種方式同時開啓時,數據恢復Redis會優先選擇AOF恢復

Redis面試題(2021最新版)

優勢:

  1. 數據安全,aof 持久化能夠配置 appendfsync 屬性,有 always,每進行一次 命令操做就記錄 到 aof 文件中一次。
  2. 經過 append 模式寫文件,即便中途服務器宕機,能夠經過 redis-check-aof 工具解決數據一 致性問題。
  3. AOF 機制的 rewrite 模式。AOF 文件沒被 rewrite 以前(文件過大時會對命令 進行合併重寫),能夠刪除其中的某些命令(好比誤操做的 flflushall))

缺點:

  1. AOF 文件比 RDB 文件大,且恢復速度慢。
  2. 數據集大的時候,比 rdb 啓動效率低。

倆種持久化的優缺點是什麼?

  • AOF文件比RDB更新頻率高,優先使用AOF還原數據。
  • AOF比RDB更安全也更大
  • RDB性能比AOF好
  • 若是兩個都配了優先加載AOF

九、Redis 常見性能問題和解決方案:

Redis面試題(2021最新版)

十、Redis 過時鍵的刪除策略?

Redis面試題(2021最新版)

十一、Redis 的回收策略(淘汰策略)?

Redis面試題(2021最新版)

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

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

1三、Redis 的同步機制瞭解麼?

  • 答:Redis 可使用主從同步,從從同步。第一次同步時,主節點作一次 bgsave, 並同時將後續修改操做記錄到內存 buffffer, 待完成後將 rdb 文件全量同步到複製節點, 複製節點接受完成後將 rdb 鏡像加載到內存。加載完成後, 再通知主節點將期間修改的操做記錄同步到複製節點進行重放就完成了同步過程。

1四、Pipeline 有什麼好處,爲何要用 pipeline?

  • 答:能夠將屢次 IO 往返的時間縮減爲一次,前提是 pipeline 執行的指令之間沒有因果相關性。使用redis-benchmark 進行壓測的時候能夠發現影響 redis 的 QPS 峯值的一個重要因素是 pipeline 批次指令的數目。

1五、是否使用過 Redis 集羣,集羣的原理是什麼?

  1. 、Redis Sentinal 着眼於高可用, 在 master 宕機時會自動將 slave 提高爲master, 繼續提供服務。
  2. 、Redis Cluster 着眼於擴展性, 在單個 redis 內存不足時, 使用 Cluster 進行分片存儲。

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

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

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

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

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

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

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

  • 設置密碼: confifig set requirepass 123456 受權密碼: auth 123456

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

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

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

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

2二、Redis 集羣會有寫操做丟失嗎?爲何?

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

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

  • 答: 異步複製

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

  • 答: 16384 個。

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

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

2六、怎麼測試 Redis 的連通性?

  • 答: 使用 ping 命令。

2七、怎麼理解 Redis 事務?

答:

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

2) 事務是一個原子操做: 事務中的命令要麼所有被執行, 要麼所有都不執行。

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

  • 答: MULTI、EXEC、DISCARD、WATCH

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

  • 答: EXPIRE 和 PERSIST 命令。

30、Redis 如何作內存優化?

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

3一、Redis 回收進程如何工做的?

答: 一個客戶端運行了新的命令, 添加了新的數據。Redi 檢查內存使用狀況, 若是大於 maxmemory的限制, 則根據設定好的策略進行回收。一個新的命令被執行, 等等。因此咱們不斷地穿越內存限制的邊界, 經過不斷達到邊界而後不斷地回收回到邊界如下。若是一個命令的結果致使大量內存被使用(例如很大的集合的交集保存到一個新的鍵), 不用多久內存限制就會被這個內存使用量超越。

3二、都有哪些辦法能夠下降 Redis 的內存使用狀況呢?

  • 答:若是你使用的是 32 位的 Redis 實例,能夠好好利用 Hash,list,sorted set,set 等集合類型數據, 由於一般狀況下不少小的 Key-Value 能夠用更緊湊的方式存放到一塊兒。

3三、Redis 的內存用完了會發生什麼?

  • 答:若是達到設置的上限,Redis 的寫命令會返回錯誤信息( 可是讀命令還能夠正常返回。) 或者你能夠將 Redis 當緩存來使用配置淘汰機制, 當 Redis 達到內存上限時會沖刷掉舊的內容。

3四、一個 Redis 實例最多能存放多少的 keys?List、Set、Sorted Set 他們最多能存放多少元素?

  • 答:理論上 Redis 能夠處理多達 232 的 keys,而且在實際中進行了測試,每一個實例至少存放了 2 億 5千萬的 keys。咱們正在測試一些較大的值。任何 list、set、和 sorted set 均可以放 232 個元素。換句話說, Redis 的存儲極限是系統中的可用內存值。

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

  • 答: Redis 內存數據集大小上升到必定大小的時候, 就會施行數據淘汰策略。相關知識: Redis 提供 6種數據淘汰策略:
  • volatile-lru:從已設置過時時間的數據集( server.dbi.expires)中挑選最近最少使用的數據淘汰
  • volatile-ttl: 從已設置過時時間的數據集( server.dbi.expires) 中挑選將要過時的數據淘汰
  • volatile-random: 從已設置過時時間的數據集( server.dbi.expires) 中任意選擇數據淘汰
  • allkeys-lru: 從數據集( server.dbi.dict) 中挑選最近最少使用的數據淘汰
  • allkeys-random: 從數據集( server.dbi.dict) 中任意選擇數據淘汰
  • no-enviction( 驅逐) : 禁止驅逐數據

3六、Redis 最適合的場景?

一、會話緩存( Session Cache)

最經常使用的一種使用 Redis 的情景是會話緩存( session cache)。用 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, 你能夠從這裏去查看。

4, 排行榜/計數器

Redis 在內存中對數字進行遞增或遞減的操做實現的很是好。集合( Set) 和有序集合( Sorted Set)也使得咱們在執行這些操做的時候變的很是簡單,Redis 只是正好提供了這兩種數據結構。因此, 咱們要從排序集合中獲取到排名最靠前的 10 個用戶– 咱們稱之爲「 user_scores」, 咱們只須要像下面同樣執行便可: 固然,這是假定你是根據你用戶的分數作遞增的排序。若是你想返回用戶及用戶的分數,你須要這樣執行: ZRANGEuser_scores 0 10 WITHSCORES Agora Games 就是一個很好的例子, 用Ruby 實現的, 它的排行榜就是使用 Redis 來存儲數據的, 你能夠在這裏看到。

五、發佈/訂閱

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

3七、假如 Redis 裏面有 1 億個 key,其中有 10w 個 key 是以某個固定的已知的前綴開頭的,若是將它們所有找出來?

Redis面試題(2021最新版)

3八、若是有大量的 key 須要設置同一時間過時,通常須要注意什麼?

  • 答:若是大量的 key 過時時間設置的過於集中,到過時的那個時間點,redis 可能會出現短暫的卡頓現象。通常須要在時間上加一個隨機值, 使得過時時間分散一些。

3九、使用過 Redis 作異步隊列麼,你是怎麼用的?

Redis面試題(2021最新版)

40、使用過 Redis 分佈式鎖麼,它是什麼回事?

Redis面試題(2021最新版)

4一、如何實現集羣中的 session 共享存儲?

Redis面試題(2021最新版)

4二、memcached 與redis 的區別?

Redis面試題(2021最新版)

4三、查看 Redis 使用狀況及狀態信息用什麼命令?

  • info

4四、Redis 的內存用完了會發生什麼?

  • 若是達到設置的上限,Redis 的寫命令會返回錯誤信息(可是讀命令還能夠正常返回。)或 者你能夠將 Redis 當緩存來使用配置淘汰機制,當 Redis 達到內存上限時會沖刷掉舊的內容。

4五、Redis 是單線程的,如何提升多核 CPU 的利用率?

  • 能夠在同一個服務器部署多個 Redis 的實例,並把他們看成不一樣的服務器來使用,在某些時候,不管如何一個服務器是不夠的, 因此,若是你想使用多個 CPU,你能夠考慮一下分片(shard)

4六、一個 Redis 實例最多能存放多少的 keys?List、Set、Sorted Set 他們最多能存放多少元素?

Redis面試題(2021最新版)

4七、Redis 常見性能問題和解決方案?

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

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

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

(4) 儘可能避免在壓力很大的主庫上增長從庫

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

這樣的結構方便解決單點故障問題,實現 Slave 對 Master 的替換。若是 Master 掛了,能夠馬上啓用 Slave1 作 Master,其餘不變。

4八、Redis 提供了哪幾種持久化方式?

Redis面試題(2021最新版)

4九、如何選擇合適的持久化方式?

Redis面試題(2021最新版)

50、修改配置不重啓 Redis 會實時生效嗎?

Redis面試題(2021最新版)

面試題答案解析完整文檔:【Redis面試題【附答案解析】

最後

小編分享的文章到這裏就結束了,整理不易,歡迎你們一塊兒交流,喜歡小編分享的文章記得關注我點贊喲,感謝支持!

相關文章
相關標籤/搜索