1. 程式人生 > 資料庫 >Redis面試題 & 知識點 整理(一)

Redis面試題 & 知識點 整理(一)

在網上找了一些Redis相關的面試題和知識點,為了面試前做好準備,歡迎來個人網站逛逛,有更詳細的面試題。也歡迎加Q群交流:952705602

 

什麼情況使用redis做快取,而不用自帶map快取?

快取分為本地快取和分散式快取。以 Java 為例,使用自帶的 map 或者 guava 實現的是本地快取,最主要的特點是輕量以及快速,生命週期隨著 jvm 的銷燬而結束,並且在多例項的情況下,每個例項都需要各自儲存一份快取,快取不具有一致性。

使用 redis 或 memcached 之類的稱為分散式快取,在多例項的情況下,各例項共用一份快取資料,快取具有一致性。缺點是需要保持 redis 或 memcached服務的高可用,整個程式架構上較為複雜。

 

 

Redis的優點和缺點

優點

讀寫效能優異, Redis能讀的速度是110000次/s,寫的速度是81000次/s。

支援資料持久化,支援AOF和RDB兩種持久化方式。

支援事務,Redis的所有操作都是原子性的,同時Redis還支援對幾個操作合併後的原子性執行。

資料結構豐富,除了支援string型別的value外還支援hash、set、zset、list等資料結構。

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

缺點

資料庫容量受到實體記憶體的限制,不能用作海量資料的高效能讀寫,因此Redis適合的場景主要侷限在較小資料量的高效能操作和運算上。

Redis 不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切換前端的IP才能恢復。

主機宕機,宕機前有部分資料未能及時同步到從機,切換IP後還會引入資料不一致的問題,降低了系統的可用性。

Redis 較難支援線上擴容,在叢集容量達到上限時線上擴容會變得很複雜。為避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源造成了很大的浪費。

 

 

Redis有事務嗎?支援原子性嗎?

Redis有事務。

但是,Redis 事務保證了其中的一致性(C)和隔離性(I),但並不保證原子性(A)和永續性(D)。

 

Redis適合的應用場景?

計數器

可以對 String 進行自增自減運算,從而實現計數器功能。Redis 這種記憶體型資料庫的讀寫效能非常高,很適合儲存頻繁讀寫的計數量。

快取

將熱點資料放到記憶體中,設定記憶體的最大使用量以及淘汰策略來保證快取的命中率。

會話快取

可以使用 Redis 來統一儲存多臺應用伺服器的會話資訊。當應用伺服器不再儲存使用者的會話資訊,也就不再具有狀態,一個使用者可以請求任意一個應用伺服器,從而更容易實現高可用性以及可伸縮性。

全頁快取(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺。以Magento為例,Magento提供一個外掛來使用Redis作為全頁快取後端。此外,對WordPress的使用者來說,Pantheon有一個非常好的外掛 wp-redis,這個外掛能幫助你以最快速度載入你曾瀏覽過的頁面。

查詢表

例如 DNS 記錄就很適合使用 Redis 進行儲存。查詢表和快取類似,也是利用了 Redis 快速的查詢特性。但是查詢表的內容不能失效,而快取的內容可以失效,因為快取不作為可靠的資料來源。

訊息佇列(釋出/訂閱功能)

List 是一個雙向連結串列,可以通過 lpush 和 rpop 寫入和讀取訊息。不過最好使用 Kafka、RabbitMQ 等訊息中介軟體。

分散式鎖實現

在分散式場景下,無法使用單機環境下的鎖來對多個節點上的程序進行同步。可以使用 Redis 自帶的 SETNX 命令實現分散式鎖,除此之外,還可以使用官方提供的 RedLock 分散式鎖實現。

其它

Set 可以實現交集、並集等操作,從而實現共同好友等功能。ZSet 可以實現有序性操作,從而實現排行榜等功能。

 

Redis的有哪兩種持久化方案?如何選擇合適的持久化方式?

1,兩種持久化方案:

AOF持久化和RDB持久化。

2,如何選擇合適的持久化方式:

一般來說, 如果想達到足以媲美PostgreSQL的資料安全性,你應該同時使用兩種持久化功能。在這種情況下,當 Redis 重啟的時候會優先載入AOF檔案來恢復原始的資料,因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整。

如果你非常關心你的資料, 但仍然可以承受數分鐘以內的資料丟失,那麼你可以只使用RDB持久化。

有很多使用者都只使用AOF持久化,但並不推薦這種方式,因為定時生成RDB快照(snapshot)非常便於進行資料庫備份, 並且 RDB 恢復資料集的速度也要比AOF恢復的速度要快,除此之外,使用RDB還可以避免AOF程式的bug。

如果你只希望你的資料在伺服器執行的時候存在,你也可以不使用任何持久化方式。

 

為什麼說Redis是單執行緒?Redis讀寫速度是多少?為什麼這麼快?

為什麼Redis是單執行緒的

redis 核心就是 如果我的資料全都在記憶體裡,我單執行緒的去操作 就是效率最高的,為什麼呢,因為多執行緒的本質就是 CPU 模擬出來多個執行緒的情況,這種模擬出來的情況就有一個代價,就是上下文的切換,對於一個記憶體的系統來說,它沒有上下文的切換就是效率最高的。redis 用 單個CPU 繫結一塊記憶體的資料,然後針對這塊記憶體的資料進行多次讀寫的時候,都是在一個CPU上完成的,所以它是單執行緒處理這個事。在記憶體的情況下,這個方案就是最佳方案。

redis讀寫速度

redis讀寫效能測試redis官網測試讀寫能到10萬左右,非常吸引人,我在研發環境對redis進行測試,發現redis的速度的確很快,此測試是為日後應用優化提供研發參考。由於受到網路環境的限制,本機是100M的網絡卡,最高10M/s的傳輸速度,所以當測試到每秒讀取45000條時,測試機和測試伺服器上傳或者下載速度已經達到10M/s,基本到了網路瓶頸,無法再提高,這個應該是網路吞吐量的原因,不過CPU的利用率直到20%左右。如果網路傳輸速度更快的話,應該還可以提高,另外,在不進行批量獲取資料的時候,也就是每次傳送一個key獲取一個值的方式處理,基本處理能力只在1100條左右,估計是受制於網路速度的原因。

Redis為什麼這麼快

1、完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似於HashMap,HashMap的優勢就是查詢和操作的時間複雜度都是O(1);

2、資料結構簡單,對資料操作也簡單,Redis中的資料結構是專門進行設計的;

3、採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程序或者多執行緒導致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的效能消耗;

4、使用多路I/O複用模型,非阻塞IO;

5、使用底層模型不同,它們之間底層實現方式以及與客戶端之間通訊的應用協議不一樣,Redis直接自己構建了VM 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求;

 

Redis 和Memcached有什麼區別

簡單來說:

memcached所有的值均是簡單的字串,redis作為其替代者,支援更為豐富的資料型別。

redis的速度比memcached快很多。

redis可以持久化其資料。

 

Redis常用資料型別有哪些,它們的應用場景是什麼?

http://qiniu.how2ps.top/largePic/20201229/85b5637624994587b65c7f8869ff5a28.png

請簡單概括redis是什麼

Redis,全稱為:Remote Dictionary Server(遠端資料服務),是一個使用 C 語言編寫的,開源的(BSD許可)高效能非關係型(NoSQL)的鍵值對資料庫

Redis 可以儲存鍵和五種不同型別的值之間的對映。鍵的型別只能為字串,值支援五種資料型別:字串、列表、集合、散列表、有序集合

與傳統資料庫不同的是 Redis 的資料是存在記憶體中的,所以讀寫速度非常快,因此 redis 被廣泛應用於快取方向,每秒可以處理超過 10萬次讀寫操作,是已知效能最快的Key-Value DB。

另外,Redis 也經常用來做分散式鎖

除此之外,Redis 支援事務 、持久化、LUA指令碼、LRU驅動事件、多種叢集方案

什麼是NoSQL? NoSQL和關係型資料庫的區別? 為什麼使用NoSQL? Redis是NoSQL嗎?

一、NoSQL的簡介

NoSQL,指的是非關係型的資料庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。NoSQL用於超大規模資料的儲存。這些型別的資料儲存不需要固定的模式,無需多餘操作就可以橫向擴充套件。

二、Nosql和關係型資料庫的區別

1.儲存方式。略

2.儲存結構。略

3.儲存規範。略

4.儲存擴充套件。略

5.查詢方式。略

6.事務。略

7.效能。略

8.授權方式。略

三、為什麼使用NoSQL ?

今天我們可以通過第三方平臺(如:Google,Facebook等)可以很容易的訪問和抓取資料。使用者的個人資訊,社交網路,地理位置,使用者生成的資料和使用者操作日誌已經成倍的增加。我們如果要對這些使用者資料進行挖掘,那SQL資料庫已經不適合這些應用了,NoSQL資料庫的發展也卻能很好的處理這些大的資料。

四,Redis是NoSQL。