1. 程式人生 > >Redis面試題總結(2)

Redis面試題總結(2)

1. 使用Redis有哪些好處?

(1) 速度快,因為資料存在記憶體中,類似於HashMap,HashMap的優勢就是查詢和操作的時間複雜度都是O(1)

(2) 支援豐富資料型別,支援string,list,set,sorted set,hash

(3) 支援事務,操作都是原子性,所謂的原子性就是對資料的更改要麼全部執行,要麼全部不執行

(4) 豐富的特性:可用於快取,訊息,按key設定過期時間,過期後將會自動刪除

2. redis相比memcached有哪些優勢?

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

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

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

(4)Redis支援資料的備份,即master-slave模式的資料備份。

(5)、使用底層模型不同

它們之間底層實現方式 以及與客戶端之間通訊的應用協議不一樣。

Redis直接自己構建了VM 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求。

(6)value大小:redis最大可以達到1GB,而memcache只有1MB

3. redis常見效能問題和解決方案:

(1) Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案

(Master寫記憶體快照,save命令排程rdbSave函式,會阻塞主執行緒的工作,當快照比較大時對效能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫記憶體快照;AOF檔案過大會影響Master重啟的恢復速度)

(2) 如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次

(3) 為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內

(4) 儘量避免在壓力很大的主庫上增加從庫

(5) 主從複製不要用圖狀結構,用單向連結串列結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3…

這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。

redis的一些其他特點:

(1)Redis是單程序單執行緒的

redis利用佇列技術將併發訪問變為序列訪問,消除了傳統資料庫序列控制的開銷

(2)讀寫分離模型

通過增加Slave DB的數量,讀的效能可以線性增長。為了避免Master DB的單點故障,叢集一般都會採用兩臺Master DB做雙機熱備,所以整個叢集的讀和寫的可用性都非常高。
讀寫分離架構的缺陷在於,不管是Master還是Slave,每個節點都必須儲存完整的資料,如果在資料量很大的情況下,叢集的擴充套件能力還是受限於單個節點的儲存能力,而且對於Write-intensive型別的應用,讀寫分離架構並不適合。

(3)資料分片模型

為了解決讀寫分離模型的缺陷,可以將資料分片模型應用進來。

可以將每個節點看成都是獨立的master,然後通過業務實現資料分片。

結合上面兩種模型,可以將每個master設計成由一個master和多個slave組成的模型。

(4)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種機制,volatileallkeys規定了是對已設定過期時間的資料集淘汰資料還是從全部資料集淘汰資料,後面的lruttl以及random是三種不同的淘汰策略,再加上一種no-enviction永不回收的策略。

    使用策略規則:

      1、如果資料呈現冪律分佈,也就是一部分資料訪問頻率高,一部分資料訪問頻率低,則使用allkeys-lru

      2、如果資料呈現平等分佈,也就是所有的資料訪問頻率都相同,則使用allkeys-random