redis面試總結
單執行緒的redis為什麼這麼快
1.所有的資料都在記憶體中,所有的運算都是記憶體級別的運算。 2.單執行緒避免了多執行緒的切換性 能損耗問題。 3.Redis的IO多路複用:利用epoll來實現IO多路複用,將連線資訊和事件放到佇列中,依次放到 檔案事件分派器,事件分派器將事件分發給事件處理器。 (C10K問題:一個TCP連線,就需要分配一個程序。假如有C10K,就需要建立1W個程序,可想而知單機是無法承受的。解決:同一個執行緒/程序同時處理多個連線,即I/O多路複用,NIO) epoll方式:該方式可以說是C10K問題的killer,他不去輪詢監聽所有檔案控制代碼是否已經就緒。epoll只對發生變化的檔案控制代碼感興趣。其工作機制是,使用"事件"的就緒通知方式,通過epoll_ctl註冊檔案描述符fd,一旦該fd就緒,核心就會採用類似callback的回撥機制來啟用該fd, epoll_wait便可以收到通知, 並通知應用程式。而且epoll使用一個檔案描述符管理多個描述符,將使用者程序的檔案描述符的事件存放到核心的一個事件表中, 這樣資料只需要從核心快取空間拷貝一次到使用者程序地址空間。而且epoll是通過核心與使用者空間共享記憶體方式來實現事件就緒訊息傳遞的,其效率非常高。 4. 支援豐富資料型別,支援string,list,set,sorted set,hash 5.支援事務,操作都是原子性,所謂的原子性就是對資料的更改要麼全部執行,要麼全部不執行 6. 豐富的特性:可用於快取,訊息,按key設定過期時間,過期後將會自動刪除如何解決redis的併發競爭key問題 Redis持久化- Redis將AOF重寫程式放到子程序(後臺)裡執行。這樣處理的最大好處是:
- 子程序進行AOF重寫期間,主程序可以繼續處理命令請求;
- 子程序帶有主程序的資料副本,使用子程序而不是執行緒,可以避免在鎖的情況下,保證資料的安全性。
- 子程序在進行AOF重寫期間,伺服器處理新的命令可能對現有的資料進行修改,導致當前資料庫和重寫後的AOF檔案中的資料不一致。
為了解決這種資料不一致的問題,Redis增加了一個AOF重寫快取,這個快取在fork出子程序之後開始啟用,Redis伺服器主程序在執行完寫命令之後,會同時將這個寫命令追加到AOF緩衝區和AOF重寫緩衝區。
- 即子程序在執行AOF重寫時,主程序需要執行以下三個工作:
- 執行client發來的命令請求;
- 將寫命令追加到現有的AOF檔案中;
- 將寫命令追加到AOF重寫快取中。
完成AOF重寫之後
-
-
當子程序完成對AOF檔案重寫之後,向父程序傳送一個完成訊號,父程序會呼叫一個訊號處理函式,完成以下工作:
- 將AOF重寫快取中的內容全部寫入到新的AOF檔案中;新的AOF檔案中儲存當前資料庫最新的狀態;
- 對新的AOF檔案進行改名,原子的覆蓋原有的AOF檔案;完成新舊兩個AOF檔案的替換。
-
-
在整個AOF後臺重寫過程中,“主程序寫入命令到AOF快取”和“對新的AOF檔案改名,覆蓋舊檔案。會造成主程序阻塞。
AOF重寫是為了解決AOF檔案體積膨脹的問題,重寫過程基本上不影響Redis主程序處理命令請求;
AOF重寫實際上是針對資料庫的當前狀態來進行的,重寫過程中不會讀寫、也不適用原來的AOF檔案;
AOF可以由使用者手動觸發,也可以由伺服器自動觸發。
Redis過期策略:
Keys的過期時間使用Unix時間戳儲存;
Redis keys過期有兩種方式:被動和主動方式;
當一些客戶端嘗試訪問它時,key會被發現並主動的過期。同時,定時隨機測試設定keys的過期時間。所有這些過期的keys將會從金鑰空間刪除。
具體就是Redis每秒10次做的事情:
- 測試隨機的20個keys進行相關過期檢測。
- 刪除所有已經過期的keys。
- 如果有多於25%的keys過期,重複步奏1.
在複製AOF檔案時如何處理過期
為了獲得正確的行為而不犧牲一致性,當一個key過期,DEL
將會隨著AOF文字一起合成到所有附加的slaves。在master例項中,這種方法是集中的,並且不存在一致性錯誤的機會。然而,當slaves連線到master時,不會獨立過期keys(會等到master執行DEL命令),他們任然會在資料集裡面存在,所以當slave當選為master時淘汰keys會獨立執行,然後成為master。
Redis事務:
事務可以一次執行多個命令, 並且帶有以下兩個重要的保證:
-
-
事務是一個單獨的隔離操作:事務中所有命令都會序列化、按順序地執行。在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。
-
事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行。
-
Redis 在事務失敗時不進行回滾,而是繼續執行餘下的命令:
-
- Redis 命令只會因為錯誤的語法而失敗(並且這些問題不能在入隊時發現),或是命令用在了錯誤型別的鍵上面:這也就是說,失敗的命令是由程式設計錯誤造成的,這些錯誤應該在開發的過程中被發現,不應該出現在生產環境中。
- 因為不需要對回滾進行支援,所以 Redis 的內部可以保持簡單且快速。
- 維護叢集的元資料有兩種方式:集中式和gossip
- 10000埠