面對高吞吐量的訪問需求,同乙個db這個key-value的hashtable面臨著來自客戶端的併發訪問。這個過程中hashtable可能會訪問相同桶、rehase,如何保證客戶端併發訪問時hashtable的執行緒安全?redis的做法很直接:單執行緒的處理來自所有客戶端的併發請求。
redis伺服器端對於命令的處理是單執行緒的,但是i/o層面卻同時面向多個客戶端併發的提供服務,併發到內部單執行緒的轉化通過多路復用框架實現,如下圖所示。
上圖中粗線描述的就是這個單執行緒主迴圈的主要邏輯:
readqueryfromclient處理來自客戶端的資料,他會讀取每乙個完整的命令並執行,再將執行結果暫存,待客戶端對應fd準備好寫時向客戶端寫入。所以該方法需要為fd註冊ae_writable事件並以sendreplytoclient作為處理器。所以該方法需要為fd註冊ae_writable事件並以sendreplytoclient作為處理器。對於multi(批處理的事務),需等到multi包含乙個全部的命令時才進行執行;
sendreplytoclient將暫存的執行結果寫回客戶端。
在主線程的主迴圈執行過程中,有乙個物件持續的流轉並記錄著redis的事件狀態,redis就是由這些事件驅動運轉的:
typedef struct aeeventloop aeeventloop;
其中events和fired共同維護著和多路復用框架互動的各個事件,而aetimeevent*以鍊錶的形式維護著待處理的定時任務(aetimeevent):
typedef strut aetimeevent aetimeevent;
其中兩個when_表示這個任務下一次執行時間,timeproc表示定時任務的執行邏輯。timeproc函式的返回值為這個任務執行完了以後下次再執行的時間間隔,對於週期性的定時任務,timeproc每次總是返回乙個正數(執行間隔),而對於一次性的任務timeproc則返回ae_nomore表示「不存在下次執行」。
上節提到「aeapipoll的等待超時時間取決於定時任務」,redis只有乙個執行緒,迴圈的處理來自客戶端的請求和定時任務,如何保證每個定時任務按時執行呢?下圖展示了定時任務的執行過程。
如上圖所示,aeapipoll方法最多等到待處理定時任務中最近的乙個的執行時刻,如果多路復用框架未返回已ready的事件,則redis直接執行定時任務。
每次乙個aetimeevent執行結束後,都會根據其timeproc方法的返回值更改其下次執行的時間(when_sec/when_ms),如果timeproc返回ae_nomore,則將aetimeevent刪除之。
預設情況下,redis指揮有乙個週期性定時任務servercron存在,他負責:
servercron通過redisserver類的hz屬性進行控制。
redis單機安裝
最近打算跳槽,網上查閱了一些面試題,發現redis出現的頻率比較高。最初也沒怎麼重視,約了面試後發現基本十個面試官中有八個會問到redis。這幾天在網上查了redis相關資料,有了些粗淺的了解。但這並不能在面試中幫我很好的回答面試官的提問。還是因為自己缺乏在實際專案中的應用。所以打算自己動手操作下r...
Redis 搭建(單機)
在安裝redis前需要安裝gcc c yum install y gcc c 安裝完畢後進入redis目錄進行安裝 cd redis 5.0.8 make make install redis安裝完成後 修改redis配置檔案 vi opt download redis 5.0.8 redis.co...
redis單機安裝
2 上傳至伺服器 usr fyy packages 3.執行解壓命令tar zxvf redis 5.0.10.tar.gz 4.cd redis 5.0.10 5.make 6.make install,一般會生成到cd usr local bin 目錄下 7.已經可以啟動了,有兩種啟動方式 1 ...