您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“redis為什么用單線程”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“redis為什么用單線程”吧!
什么是redis的單線程(核心功能在單線程上,并不是所有功能)
持久化
異步刪除
集群數(shù)據(jù)同步
redis的網(wǎng)絡(luò)IO和鍵值對(duì)讀寫是由一個(gè)線程完成的(redis的核心服務(wù))
redis的其他功能由額外線程完成
【相關(guān)推薦:Redis視頻教程】
多線程的開銷
被多線程同時(shí)訪問共享資源,比如共享的數(shù)據(jù)結(jié)構(gòu)
為了保證線程安全,導(dǎo)致性能的犧牲
粗粒度的鎖導(dǎo)致所有串行,系統(tǒng)的吞吐率隨著線程的增加而增加
使用多線程可以增加系統(tǒng)吞吐率(每個(gè)請(qǐng)求),增加系統(tǒng)擴(kuò)展性
無限的增加線程數(shù),導(dǎo)致吞吐量下降
因此為了節(jié)省并發(fā)資源的管理,redis使用單線程,保證所有操作串行化
redis大部分操作都在內(nèi)存上+高效的數(shù)據(jù)結(jié)構(gòu)
redis采用多路復(fù)用機(jī)制,在網(wǎng)絡(luò)中處理大量客戶端請(qǐng)求,實(shí)現(xiàn)高吞吐率
socket通信過程(網(wǎng)絡(luò)IO處理+鍵值對(duì)讀寫+網(wǎng)絡(luò)IO處理)
SimpleKV 為了處理一個(gè) Get 請(qǐng)求
需要監(jiān)聽客戶端請(qǐng)求(bind/listen)
和客戶端(代碼)建立連接(accept)
從 socket 中讀取請(qǐng)求(recv)
解析客戶端發(fā)送請(qǐng)求(parse)
根據(jù)請(qǐng)求類型讀取鍵值數(shù)據(jù)(get)
最后給客戶端返回結(jié)果,即向 socket 中寫回?cái)?shù)據(jù)(send)
潛在的阻塞點(diǎn)
accept() 未能成功建立連接時(shí),會(huì)一直阻塞\
recv() 從客戶端讀取數(shù)據(jù)時(shí),會(huì)一直阻塞\
socket的非阻塞模式
保證 Redis 線程,既不會(huì)像基本 IO 模型中一直在阻塞點(diǎn)等待,也不會(huì)導(dǎo)致 Redis 無法處理實(shí)際到達(dá)的連接請(qǐng)求或數(shù)據(jù)
Linux 中的 IO 多路復(fù)用機(jī)制
Linux中的IO多路復(fù)用機(jī)制指一個(gè)線程處理多個(gè)IO流,select/poll
在單線程下,同時(shí)存在監(jiān)聽多個(gè)套接字和已連接套接字
具體實(shí)現(xiàn)
首先將事件放入事件隊(duì)列,無需潤(rùn)徐請(qǐng)求是否實(shí)際發(fā)生,避免CPU資源浪費(fèi)
根據(jù)相應(yīng)的事件執(zhí)行響應(yīng)的操作
FD是多個(gè)套接字
Redis使用epoll機(jī)制,讓內(nèi)核監(jiān)聽套接字
Redis可以和多個(gè)客戶端連接并處理請(qǐng)求,從而提升并發(fā)性
select/epoll提供了基于事件的回調(diào)機(jī)制,針對(duì)不同的事件調(diào)用對(duì)應(yīng)的處理函數(shù)
到此,相信大家對(duì)“redis為什么用單線程”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。