疑問:
redis是單線程的,如何并發處理多個請求?
下面是我個人的理解。
答案是:使用操作系統的多進程機制。也就是我們常說的,多路復用API,多路復用API本質上是對操作系統多路復用功能的封裝。
什么是操作系統的多進程呢?
簡單來說就是Copy On Write。當父進程對redis頁面進行修改時,會先把這個頁面的數據復制一份,然后在這個副本上進行修改,子進程讀取的還是原來的頁面,并且這個頁面不會被修改,所以子進程可以放心的處理自己的事情,進行數據持久化操作。這就是為什么RDB持久化也叫做快照的原因。
接下來還有一個問題要搞清楚,就是linux系統的父子進程的關系,因為我們還沒有很好的解釋:單線程的linux如何解決并發請求。
一個線程只能屬于一個進程,但是一個進程可以fork生成多個子進程,這就是redis單線程能夠處理多個并發請求的原因。
也就是說,redis的設計者,把多線程的復雜性,轉給了操作系統。在redis層面,無需考慮多線程問題。