redis是多線程的嗎

redis是多線程的嗎

redis是單線程,單線程指的是網(wǎng)絡(luò)請求模塊使用了一個線程(所以不需考慮并發(fā)安全性),即一個線程處理所有網(wǎng)絡(luò)請求,其他模塊仍用了多個線程。

redis可以能夠快速執(zhí)行的原因:

(1) 絕大部分請求是純粹的內(nèi)存操作(非??焖伲?br />(2) 采用單線程,避免了不必要的上下文切換和競爭條件
(3) 非阻塞IO-IO多路復(fù)用(IO多路復(fù)用是什么意思?)

IO多路復(fù)用中有三種方式:select,poll,epoll。需要注意的是,select,poll是線程不安全的,epoll是線程安全的

redis內(nèi)部實(shí)現(xiàn)采用epoll,采用了epoll+自己實(shí)現(xiàn)的簡單的事件框架。epoll中的讀、寫、關(guān)閉、連接都轉(zhuǎn)化成了事件,然后利用epoll的多路復(fù)用特性,絕不在io上浪費(fèi)一點(diǎn)時間 這3個條件不是相互獨(dú)立的,特別是第一條,如果請求都是耗時的,采用單線程吞吐量及性能可想而知了。應(yīng)該說redis為特殊的場景選擇了合適的技術(shù)方案。

redis的內(nèi)部實(shí)現(xiàn):

內(nèi)部實(shí)現(xiàn)采用epoll,采用了epoll+自己實(shí)現(xiàn)的簡單的事件框架。epoll中的讀、寫、關(guān)閉、連接都轉(zhuǎn)化成了事件,然后利用epoll的多路復(fù)用特性,絕不在io上浪費(fèi)一點(diǎn)時間 這3個條件不是相互獨(dú)立的,特別是第一條,如果請求都是耗時的,采用單線程吞吐量及性能可想而知了。應(yīng)該說redis為特殊的場景選擇了合適的技術(shù)方案。

Redis關(guān)于線程安全問題:

redis實(shí)際上是采用了線程封閉的觀念,把任務(wù)封閉在一個線程,自然避免了線程安全問題,不過對于需要依賴多個redis操作的復(fù)合操作來說,依然需要鎖,而且有可能是分布式鎖。

使用Redis有哪些好處?

(1) 速度快,因?yàn)閿?shù)據(jù)存在內(nèi)存中,類似于HashMap,HashMap的優(yōu)勢就是查找和操作的時間復(fù)雜度都是O(1)

(2) 支持豐富數(shù)據(jù)類型,支持String,list,set,sorted set,hash

(3) 支持事務(wù),操作都是原子性,所謂的原子性就是對數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行

(4) 豐富的特性:可用于緩存,消息,按key設(shè)置過期時間,過期后將會自動刪除

Redis常見性能問題和解決方案:

(1) Master最好不要做任何持久化工作,如RDB內(nèi)存快照和AOF日志文件;(Master寫內(nèi)存快照,save命令調(diào)度rdbSave函數(shù),會阻塞主線程的工作,當(dāng)快照比較大時對性能影響是非常大的,會間斷性暫停服務(wù),所以Master最好不要寫內(nèi)存快照;AOF文件過大會影響Master重啟的恢復(fù)速度)

(2) 如果數(shù)據(jù)比較重要,某個Slave開啟AOF備份數(shù)據(jù),策略設(shè)置為每秒同步一次

(3) 為了主從復(fù)制的速度和連接的穩(wěn)定性,Master和Slave最好在同一個局域網(wǎng)內(nèi)

(4) 盡量避免在壓力很大的主庫上增加從庫

(5) 主從復(fù)制不要用圖狀結(jié)構(gòu),用單向鏈表結(jié)構(gòu)更為穩(wěn)定,即:Master

更多Redis相關(guān)知識,請?jiān)L問Redis使用教程欄目!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享