為什么Redis使用單線程模型會達(dá)到每秒萬級別的處理能力呢?可以將其歸結(jié)為三點(diǎn):
- 純內(nèi)存訪問Redis將所有數(shù)據(jù)放在內(nèi)存中,內(nèi)存的相應(yīng)時(shí)長大約為100ns膜楷,這是Redis達(dá)到每秒萬級別訪問的重要基礎(chǔ)届榄。
- 非阻塞I/O,Redis使用epoll作為I/O多路復(fù)用技術(shù)的實(shí)現(xiàn)秦效,再加上Redis自身的事件處理模型將epoll中的連接、讀寫涎嚼、關(guān)閉都轉(zhuǎn)換為事件阱州,不在網(wǎng)絡(luò)I/O上浪費(fèi)過多的時(shí)間。
- 單線程避免了線程切換和競態(tài)產(chǎn)生的消耗法梯。
Redis I/O多路復(fù)用
- 在 I/O 多路復(fù)用模型中苔货,最重要的函數(shù)調(diào)用就是 select,該方法的能夠同時(shí)監(jiān)控多個(gè)文件描述符的可讀可寫情況立哑,當(dāng)其中的某些文件描述符可讀或者可寫時(shí)蒲赂,select 方法就會返回可讀以及可寫的文件描述符個(gè)數(shù)。
- 關(guān)于 select 的具體使用方法刁憋,在網(wǎng)絡(luò)上資料很多滥嘴,這里就不過多展開介紹了;與此同時(shí)也有其它的 I/O 多路復(fù)用函數(shù) epoll/kqueue/evport至耻,它們相比 select 性能更優(yōu)秀若皱,同時(shí)也能支撐更多的服務(wù)。
單線程的好處:
- 單線程可以簡化數(shù)據(jù)結(jié)構(gòu)和算法的實(shí)現(xiàn)尘颓。
- 單線程避免了線程切換和競態(tài)產(chǎn)生的消耗走触,對于服務(wù)端開發(fā)來說,鎖和線程切換通常是性能殺手疤苹。
但是單線程有一個(gè)問題:
對于每個(gè)命令的執(zhí)行時(shí)間是有要求的互广。如果某個(gè)命令執(zhí)行過長,會造成其他命令的阻塞,對于Redis這種高性能的服務(wù)來說是致命的惫皱,所以Redis是面向快速執(zhí)行場景的數(shù)據(jù)庫像樊。