天天看點

web前端求職必會之Redis常見面試題答疑

  web前端求職必會之Redis常見面試題答疑,Redis(全稱:Remote Dictionary Server 遠端字典服務)是一個開源的使用ANSI C語言編寫、支援網絡、可基于記憶體亦可持久化的日志型、Key-Value資料庫,并提供多種語言的API。很多web前端求職時都會被問到Redis相關問題,尤其是在BRT類名企,接下來就給大家分享web前端求職必會的Redis常見面試題及答案。

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

  1) memcached所有的值均是簡單的字元串,redis作為其替代者, 支援更為豐富的資料類型;

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

  3) redis可以持久化其資料。

  2、Redis有哪幾種資料淘汰政策?

  noeviction:傳回錯誤當記憶體限制達到并且用戶端嘗試執行會讓更多記憶體被使用的指令(大部分的寫入指令,但DEL和幾個例外)。

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

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

  allkeys-random: 回收随機的鍵使得新添加的資料有空間存放。

  volatile-random: 回收随機的鍵使得新添加的資料有空間存放,但僅限于在過期集合的鍵。volatile-ttl: 回收在過期集合的鍵,并且優先回收存活時間(TTL)較短的鍵,使得新添加的資料有空間存放。

  3、Redis是單線程還是多線程?有何優勢?

  Redis是單線程,但是Redis 6釋出後,它其實是支援多線程的。Redis是多線程的優勢有兩點:

  1)單線程Redis的性能瓶頸主要在于網絡的IO消耗,是以我們在優化的方向就是要提高網絡IO性能。

  2)Redis 6 引入的多線程IO特性對性能提升至少是一倍以上。Redis的多線程部分隻是用來處理網絡資料的讀寫和協定解析,執行指令仍然是單線程。

  4、Redis主從複制會出現哪些問題?

  1)一旦主節點當機,從節點晉升為主節點,同時需要修改應用方的主節點位址,還需要指令所有從節點去複制新的主節點,整個過程需要人工幹預。

  2)主節點的寫能力受到單機的限制。

  3)主節點的存儲能力受到單機的限制。

  4)原生複制的弊端在早期的版本中也會比較突出,比如:redis複制中斷後,從節點會發起psync。此時如果同步不成功,則會進行全量同步,主庫執行全量備份的同時,可能會造成毫秒或秒級的卡頓。

  5、為什麼Redis需要把所有資料放到記憶體中?

  Redis為了達到最快的讀寫速度将資料都讀到記憶體中,并通過異步的方式将資料寫入磁盤。是以Redis具有快速和資料持久化的特征。如果不将資料放在記憶體中,磁盤I/O速度為嚴重影響Redis的性能。在記憶體越來越便宜的今天,Redis将會越來越受歡迎。

  如果設定了最大使用的記憶體,則資料已有記錄數達到記憶體限值後不能繼續插入新值。

  6、有哪些Redis分區實作方案?

  用戶端分區就是在用戶端就已經決定資料會被存儲到哪個Redis節點或者從哪個Redis節點讀取。大多數用戶端已經實作了用戶端分區。代理分區 意味着用戶端将請求發送給代理,然後代理決定去哪個節點寫資料或者讀資料。

  代理根據分區規則決定請求哪些Redis執行個體,然後根據Redis的響應結果傳回給用戶端。Redis和memcached的一種代理實作就是Twemproxy查詢路由(Query routing) 的意思是用戶端随機地請求任意一個Redis執行個體,然後由Redis将請求轉發給正确的Redis節點。

  Redis Cluster實作了一種混合形式的查詢路由,但并不是直接将請求從一個Redis節點轉發到另一個Redis節點,而是在用戶端的幫助下直接redirected到正确的Redis節點。

  7、Redis持久化資料和緩存怎麼做擴容?

  如果Redis被當做緩存使用,使用一緻性哈希實作動态擴容縮容。如果Redis被當做一個持久化存儲使用,必須使用固定的keys-to-nodes映射關系,節點的數量一旦确定不能變化。否則的話(即Redis節點需要動态變化的情況),必須使用可以在運作時進行資料再平衡的一套系統,而目前隻有Redis叢集可以做到這樣。

  8、Redis與其他key-value存儲有什麼不同?

  Redis有着更為複雜的資料結構并且提供對他們的原子性操作,這是一個不同于其他資料庫的進化路徑。Redis的資料類型都是基于基本資料結構的同時對程式員透明,無需進行額外的抽象。Redis運作在記憶體中但是可以持久化到磁盤,是以在對不同資料集進行高速讀寫時需要權衡記憶體,應為資料量不能大于硬體記憶體。在記憶體資料庫方面的另一個優點是, 相比在磁盤上相同的複雜的資料結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多内部複雜性很強的事情。 同時,在磁盤格式方面他們是緊湊的以追加的方式産生的,因為他們并不需要進行随機通路。