掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
深入了解Redis線程工作模式

平泉ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
Redis作為一種高性能的key-value存儲系統(tǒng),無疑成為了熱門技術(shù)之一。Redis快速處理大量數(shù)據(jù)的能力取決于其高效的線程工作模式。本文將深入了解Redis的線程工作模式,以便更好的理解Redis的內(nèi)部工作原理。
Redis的線程模型
Redis從2.8版本開始,采用了多線程方式實現(xiàn)I/O多路復(fù)用,用于處理并發(fā)連接請求。Redis線程數(shù)默認(rèn)為cpu核心數(shù)量。其中,主線程被用于處理客戶端的連接和協(xié)議解析,以及同步的I/O操作。工作線程負(fù)責(zé)處理異步的 I/O 操作(如文件事件),并執(zhí)行在key空間中定義的命令。下圖是Redis多線程架構(gòu)示意圖:

如上圖所示,Redis主線程接收客戶端請求,同時與工作線程協(xié)作處理I/O讀寫。工作線程也處理Redis持久化操作和其他底層任務(wù)。Redis線程模型的優(yōu)點是減少鎖競爭,在高并發(fā)下性能得到強力保障。
Redis的I/O模型
Redis使用了epoll進行I/O多路復(fù)用,以實現(xiàn)高并發(fā)讀寫。epoll采取了邊緣觸發(fā)(EPOLLET)的方式,只有當(dāng)文件描述符狀態(tài)發(fā)生變化時,內(nèi)核才會通知應(yīng)用程序。
Redis采用epoll的ET模式以減少CPU上下文切換,處理過程簡單,效率高,并且避免了遺漏的文件描述符事件。ET模式需要確保讀取或?qū)懭氲木彺鎱^(qū),都應(yīng)該被完整的處理一遍。因此,當(dāng)Redis請求的大小超過系統(tǒng)默認(rèn)的緩沖區(qū)大小時,redis在異步讀取/寫入時,需要進行多次的讀寫操作,以確保緩沖區(qū)文本被完整地讀出/寫入。以下是Redis ET讀寫實現(xiàn)過程的示意圖:

Redis的AOF持久化模式
Redis主要支持兩種持久化方式:RDB和AOF。不過本文只討論AOF持久化策略,它也是Redis使用最多的一種策略。AOF的寫操作可能會卡住主進程,從而影響性能。為了降低寫操作的影響,Redis容器采取了異步AOF持久化模式,即BGREWRITEAOF(后臺重寫)。該模式通過生成新的AOF文件,然后將其追加到原AOF文件中。該過程在后臺完成,不會阻塞Redis的主工作線程。以下為Redis AOF持久化模式示意圖:

從上圖中可以看出,Redis將不太重要的任務(wù)交給了工作線程,并將I/O操作異步化,以避免重要任務(wù)的阻塞。同時,Redis采取了異步AOF持久化模式,以減輕寫操作所產(chǎn)生的性能影響。Redis的線程工作模式十分高效,可接受高并發(fā)請求,具有出色的穩(wěn)定性和高可用性。
本文示例代碼:
// 1. mn thread
aeMn()
{
// 等待事件
aeApiPoll();
// …
// 接收到 read 命令后
if (socket_read_pending()) {
// 將命令交給工作線程執(zhí)行
worker_pool.schedule(read_handler, socket_fd);
}
// …
// 在工作線程中處理異步 I/O 請求
worker_pool.run_io_threads();
// …
}
// 2. 工作線程
void run_io_threads()
{
// 利用 poll() 函數(shù)進入等待就緒的狀態(tài)
// 和 poll() 函數(shù)類似,這里我們用自己封裝的 async_poll() 函數(shù)
while(true){
// 處理正在執(zhí)行的 IO 請求
process_io_requests();
// 查詢當(dāng)前是否有需要執(zhí)行的操作
if (async_poll(thread_read_fds)) {
// 執(zhí)行每個客戶端的命令
process_read_commands();
// 執(zhí)行文件事件
process_disk_events();
}
// 執(zhí)行 Redis 的一些常規(guī)操作
process_checkpointing();
process_timers();
process_scroll();
}
}
// 3. 異步 AOF 備份操作
void bg_rewrite_aof()
{
// 創(chuàng)建新文件
aof_file = open(“redis.aof.new”, O_CREAT | O_RDWR, S_IRWXU);
// …
// 異步寫入
while(true) {
append_to_file(io_buffer, io_size);
// 寫入速度過快
if (a_socket_send_buffer_full()) {
// 等待套接字寫空
a_socket_send_wt_until_unblock();
}
// 壓縮并移動文件
compress_and_transfer_approved_files();
}
}
// 4. Redis 的多線程模塊
class WorkerPool {
public:
// 從工作隊列中取出 worker 開始執(zhí)行
void run_worker(Worker& worker) {
pthread_create(worker.tid, NULL, worker.worker_routine, (void*)&tpool);
}
};
int mn() {
WorkerPool tp;
Worker* threads[THREAD_NUM];
for (int i = 0; i
threads[i].tid = i;
threads[i].worker_routine = worker_routine;
tp.run_worker(threads[i]);
}
}
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流