1. 程式人生 > >面試題一:redis相關問題

面試題一:redis相關問題

介紹

Redis是一個開源的記憶體中的資料結構儲存系統,

Redis採用的是基於記憶體的採用的是單程序單執行緒模型的 KV 資料庫由C語言編寫

1:操作Redis執行緒安全嗎?

答:

Redis是單程序的,所以是執行緒安全的。Redis是利用佇列技術將併發訪問變為序列訪問。

Redis使用了單執行緒的設計,所有的客戶端請求,也就是redis資料庫的連線,使用一種複用的技術。redis可以在任何時候處理單個請求,所有的請求是順序處理的。因為處理單個請求的時間非常短,所以所有的產出通常不會有慢的感覺,但是最重要的是這些產品被設計為非阻塞系統呼叫。提到過Redis從2.4版本後是單執行緒的。所以redis是執行緒安全的,不會同時有多個執行緒操作redis資料庫的資料。

 

2:mySQL裡有2000w資料,redis中只存20w的資料,如何保證redis中的資料都是熱點資料

相關知識:redis 記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略。redis 提供 6種資料淘汰策略: 
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(驅逐):禁止驅逐資料

使用策略規則:

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

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

3:為什麼使用Redis,它有什麼好處?

(1)速度快,因為資料存放在記憶體中。

(2)支援多種資料型別,支援String,List,Set,Sorted set,Hash(底層相當於一個Map結構)。

(3)提供了RDB和AOF兩種持久化方式。

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

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

4:Redis相比memcached有哪些優勢?

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

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

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

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

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

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

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

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

  (2) Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案,特別是不要啟用記憶體快照做持久化。

Master寫記憶體快照,save命令排程rdbSave函式,會阻塞主執行緒的工作,當快照比較大時對效能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫記憶體快照。對於Master AOF持久化,如果不重寫AOF檔案,這個持久化方式對效能的影響是最小的,但是AOF檔案會不斷增大,AOF檔案過大會影響Master重啟的恢復速度,如果重寫AOF檔案,AOF在重寫的時候會佔大量的CPU和記憶體資源,出現短暫服務暫停現象。
(3)為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內。

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

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

 (6) 主從複製不要用圖狀結構,用單向連結串列結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...;這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。

6:RDB和AOF的區別:

RDB持久化:是將在指定的時間間隔內生成的資料集備份到磁碟中。(可能丟失一段時間的資料)。AOF持久化:記錄的是伺服器執行的所有寫操作指令,並在伺服器啟動時,通過重新執行這些命令來還原資料集。AOF可以每秒同步一次(預設方式),也可以每次執行寫入命令時同步一次。

7: redis的內部實現

內部實現採用epoll,採用了epoll+自己實現的簡單的事件框架。epoll中的讀、寫、關閉、連線都轉化成了事件,然後利用epoll的多路複用特性,絕不在io上浪費一點時間 這3個條件不是相互獨立的,特別是第一條,如果請求都是耗時的,採用單執行緒吞吐量及效能可想而知了。應該說redis為特殊的場景選擇了合適的技術方案。
8:為什麼說redis能夠快速執行

(1) 絕大部分請求是純粹的記憶體操作(非常快速)

(2) 採用單執行緒,避免了不必要的上下文切換和競爭條件

(3) 非阻塞IO - IO多路複用