1. 程式人生 > 其它 >2022年Redis最新面試題 - Redis基礎知識

2022年Redis最新面試題 - Redis基礎知識

最近整理一份關於Redis常見面試題的,也會根據自己的經驗, 標註一些出現的概率,最高5顆★出現的概率最高。比如這樣:

Redis 最適合的場景, 可以簡單的說說嗎?
出現概率: ★★★★

  整體目錄大概如下:

目錄

  • 一、Redis基礎知識

    • 1、什麼是 Redis, 有哪些優缺點?
    • 2、Redis 最適合的場景, 可以簡單的說說嗎?
    • 3、Redis 相比 Memcached 有哪些優勢?
    • 4、一個字串型別的值能儲存最大容量是多少?
    • 5、Redis 讀寫分離
  • 二、資料結構

    • 1、Redis的資料型別有哪些?
    • 2、說說 Redis 雜湊槽的概念?
    • 3、Hash如何實現O(1)的查詢和設定速度, 以及擴容原理
    • 4、布隆過濾器
  • 三、事務

    • 1、怎麼理解 Redis 事務?
    • 2、Redis事務執行過程
    • 3、Redis事務的一些使用場景
    • 4、Redis事務與Redis pipeline的區別
    • 5、叢集模式下Redis事務如何保證原子性
  • 四、Redis資料持久化

    • 1、為什麼 Redis 需要把所有資料放到記憶體中?
    • 2、Redis如何做持久化的?
    • 3、Redis key 的過期時間和永久有效分別怎麼設定?
  • 五、Redis叢集

    • 1、Redis 是單程序單執行緒的?
    • 2、是否使用過 Redis 叢集,叢集的原理是什麼?
    • 3、可以簡單說說你對Redis Sentinel的理解
    • 4、Redis Sentinal和Redis Cluster的區別
    • 5、Redis 的同步機制瞭解麼?
    • 6、Redis 叢集最大節點個數是多少?
  • 六、Redis淘汰策略

    • 1、Redis過期鍵的刪除策略?
    • 2、你可以簡單聊聊Redis記憶體淘汰機制(回收策略)
  • 七、Redis分散式鎖

    • 1、你知道實現實現分散式鎖有哪些方案?
  • 八、Redis快取問題

    • 1、Redis快取雪崩
    • 2、Redis快取擊穿
    • 3、Redis快取穿透
    • 4、快取預熱
    • 5、快取降級
  • 九、運維和部署

    • 1、Redis 如何設定密碼及驗證密碼?
    • 2、Redis 如何做記憶體優化?



 

一般來講在面試當中, 關於Redis相關的面試題頻率出現比較高的幾個關鍵詞是適合哪些場景、資料結構、hash實現原理和如何擴容、如何做持久化、關係型資料庫和非關係資料庫對比等等。 把這幾個點問完基本也差不多10~20分鐘了(一般一輪面試1小時左右), 基本這些可以讓面試官對你的Redis知識有一定的瞭解了。

也可以線上看我的部落格

 

也歡迎關注我的公眾號: 漫步coding。 一起交流, 在coding的世界裡漫步, 回覆: redis, 免費獲取最新Redis面試題(含答案)。

希望這篇文章可以幫助大家, 也希望大家都能找到的好工作。

Redis基礎知識

  • 什麼是 Redis, 有哪些優缺點?
  • Redis 最適合的場景, 可以簡單的說說嗎?
  • Redis 相比 Memcached 有哪些優勢?
  • 一個字串型別的值能儲存最大容量是多少?
  • Redis 讀寫分離

什麼是 Redis, 有哪些優缺點?

出現概率: ★★★★

Redis是一個非關係性資料庫, 開源的、使用C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、key-value(鍵值對)資料庫,是目前分散式架構中不可或缺的一環。

Redis伺服器程式是單程序模型,也就是在一臺伺服器上可以同時啟動多個Redis程序,而Redis的實際處理速度則完全依靠於主程序的的執行效率。若在伺服器上只執行一個Redis程序,當多個客戶端同時訪問時,伺服器的處理能力會有一定程度的下降,若在同一臺伺服器上開啟多個Redis程序,Redis在提高併發處理能力的同時會給伺服器的CPU造成很大壓力。也就是說,在實際生產環境中,需要根據實際的需求來決定開啟多少個Redis程序。若對高併發要求更高一些,可能會考慮在同一臺伺服器上開啟多個程序。若CPU資源比較緊張,採用單程序即可。

Redis優點

1)、效能極高, 讀寫效能優異,從記憶體當中進行IO讀寫速度快。

2)、支援資料的持久化(支援AOFRDB兩種持久化方式),對資料的更新採用Copy-on-write技術(寫拷貝),可以非同步的儲存在磁碟上

由於Redis的資料都存放在記憶體中,如果沒有配置持久化,redis重啟後資料就全丟失了,於是需要開啟redis的持久化功能,將資料儲存到磁 盤上,當redis重啟後,可以從磁碟中恢復資料。

redis提供兩種方式進行持久化,一種是RDB持久化:指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,實際操作過程是fork一個子程序,先將資料集寫入臨時檔案,寫入成功後,再替換之前的檔案,用二進位制壓縮儲存。

還有一種是AOF持久化:以日誌的形式記錄伺服器所處理的每一個寫、刪除操作,查詢操作不會記錄,以文字的方式記錄,可以開啟檔案看到詳細的操作記錄。

3)、支援主從複製,主機會自動將資料同步到從機,可以進行讀寫分離。

4)、資料結構豐富:除了支援string型別的value外還支援string、hash、set、sortedset、list等資料結構。

5)、原子性:多個操作通過MULTI和EXEC指令支援事務

Redis缺點

1)、主從同步,如果主機宕機,宕機前有一部分資料沒有同步到從機,會導致資料不一致。

2)、主從同步,資料同步會有延遲。

3)、讀寫分離,主機寫的負載量太大,也會導致主機的宕機

4)、資料庫容量受到實體記憶體的限制,不能用作海量資料的高效能讀寫

Redis 最適合的場景, 可以簡單的說說嗎?

出現概率: ★★★★

1、會話快取(Session Cache)最常用的一種使用Redis的情景是會話快取(session cache), Redis快取會話比其他儲存(如Memcached)的優勢在於:Redis提供持久化。

2、排行榜/計數器

Redis在記憶體中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種資料結構。

3、釋出/訂閱

Redis的釋出/訂閱功能。釋出/訂閱的使用場景確實非常多。我已看見人們在社交網路連線中使用,還可作為基於釋出/訂閱的指令碼觸發器,甚至用Redis的釋出/訂閱功能來建立聊天系統!

4、快取熱資料

可以快取一些高頻讀, 低頻寫的內容, 比如app首頁一些設定等。

5、利用BitMap統計使用者簽到、統計活躍使用者、使用者線上狀態等

Redis從2.2.0版本開始新增了setbit,getbit,bitcount等幾個bitmap相關命令。雖然是新命令,但是並沒有新增新的資料型別,因為setbit等命令只不過是在set上的擴充套件。

可以利用BitMap統計使用者簽到、統計活躍使用者、使用者線上狀態

6、限速,介面訪問頻率限制:比如傳送簡訊驗證碼的介面,通常為了防止別人惡意頻刷,會限制使用者每分鐘獲取驗證碼的頻率,例如一分鐘不能超過 5 次。

假設用於資料量上億的場景下,例如幾億使用者系統的簽到,去重登入次數統計,某使用者是否線上狀態等等。騰訊10億使用者,要幾個毫秒內查詢到某個使用者是否線上,能怎麼做?

千萬別說給每個使用者建立一個key,然後挨個記(你可以算一下需要的記憶體會很恐怖,而且這種類似的需求很多。這裡要用到位操作——使用setbit、getbit、bitcount命令。原理是:

redis內構建一個足夠長的陣列,每個陣列元素只能是0和1兩個值,然後這個陣列的下標index用來表示使用者id(必須是數字哈),那麼很顯然,這個幾億長的大陣列就能通過下標和元素值(0和1)來構建一個記憶系統。

Redis key name 約定

$dayKey = 'login:'.\date('Ymd',\time());

Redis 資料結構

key sign:20220405 sign:20220405 sign:20220405 …
offset (UserId) 1000 1001 1002
value 0 1 1
status 未簽到 已簽到 已簽到

使用經驗

127.0.0.1:6379> setbit 'login-20220405' 1
127.0.0.1:6379> setbit 'login-20220405' 100 1
(integer) 1
127.0.0.1:6379> setbit 'login-20220405' 200000000 1
(integer) 1
127.0.0.1:6379> setbit 'login-20220405' 4290000000 1
(integer) 1
127.0.0.1:6379> setbit 'login-20220405' 4300000000 1
(error) ERR bit offset is not an integer or out of range
127.0.0.1:6379> getbit 'login-20220405' 100
(integer) 1
127.0.0.1:6379> getbit 'login-20220405' 101
(integer) 0
127.0.0.1:6379>

這裡需要注意的是Redis中字串限制最大為512MB,所以點陣圖中最大可以設定2^32個不同的位(42.9億個)。圖位的最小單位是位元(bit),每個bit的值只能是0或1。 同時注意setbit時的偏移量,當偏移量很大時,可能會有較大耗時。 點陣圖不是絕對的好,有時可能更浪費空間。

Redis 相比 Memcached 有哪些優勢?

出現概率: ★★★

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

1 、資料支援型別 Memcache 對資料型別支援相對簡單。Redis 有複雜的資料型別。Redis不僅僅支援簡單的k/v型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。

2 、Redis支援資料的備份,即master-slave模式的資料備份。

3 、儲存方式 Memecache 把資料全部存在記憶體之中, 斷電後會掛掉, 資料不能超過記憶體大小。Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。

一個字串型別的值能儲存最大容量是多少?

Redis中字串限制最大為512MB

Redis 讀寫分離

出現概率: ★★★

讀取請求QPS(Queries Per Second)壓力較大的服務, 可以採用Redis讀寫分離,可以提供高可用、高效能、靈活的讀寫分離服務,滿足熱點資料集中及高併發讀取的業務需求,最大化地節約運維成本。

讀寫分離版採取鏈式複製架構,可以通過擴充套件只讀例項個數使整體例項效能呈線性增長,同時基於原始碼層面對Redis複製流程的定製優化,可以最大程度地提升線性複製的系統穩定性,充分利用每一個只讀節點的物理資源。

由於資料同步至只讀節點存在一定延遲,且採用鏈式複製,只讀節點數越多,靠近鏈路末端的只讀節點資料延遲越大,因此選用此架構時,業務需要能接受一定程度的髒資料。如果對資料一致性要求較高,推薦選用叢集架構。

你知道怎麼用Redis實現實現分散式鎖?

出現概率: ★★★★

Redis 官方站提出了一種權威的基於 Redis 實現分散式鎖的方式名叫Redlock,此種方式比原先的單節點的方法更安全。它可以保證以下特性:

安全特性:互斥訪問,即永遠只有一個client能拿到鎖

避免死鎖:最終 client 都可能拿到鎖,不會出現死鎖的情況,即使原本鎖住某資源的 client crash 了或者出現了網路分割槽

容錯性:只要大部分 Redis 節點存活就可以正常提供服務