Redis為什么快呢?能說一下I/O多路復用嗎?
Redis為什么快呢?
Redis的速度?常的快,單機的Redis就可以?撐每秒十幾萬的并發(fā),相對于MySQL來說,性能是MySQL的??倍。速度快的原因主要有?點:
- 完全基于內(nèi)存操作
- 使?單線程,避免了線程切換和競態(tài)產(chǎn)生的消耗
- 基于?阻塞的IO多路復?機制
- C語?實現(xiàn),優(yōu)化過的數(shù)據(jù)結(jié)構(gòu),基于?種基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),redis做了?量的優(yōu)化,性能極?
能說一下I/O多路復用嗎?
第一種選擇:按順序逐個檢查,先檢查A,然后是B,之后是C、D。。。這中間如果有一個學生卡住,全班都會被耽誤。這種模式就好比,你用循環(huán)挨個處理socket,根本不具有并發(fā)能力。
第二種選擇:你創(chuàng)建30個分身,每個分身檢查一個學生的答案是否正確。 這種類似于為每一個用戶創(chuàng)建一個進程或者- 線程處理連接。
第三種選擇,你站在講臺上等,誰解答完誰舉手。這時C、D舉手,表示他們解答問題完畢,你下去依次檢查C、D的答案,然后繼續(xù)回到講臺上等。此時E、A又舉手,然后去處理E和A。
第一種就是阻塞IO模型,第三種就是I/O復用模型。
Linux系統(tǒng)有三種方式實現(xiàn)IO多路復用:select、poll和epoll。
例如epoll方式是將用戶socket對應的fd注冊進epoll,然后epoll幫你監(jiān)聽哪些socket上有消息到達,這樣就避免了大量的無用操作。此時的socket應該采用非阻塞模式。
這樣,整個過程只在進行select、poll、epoll這些調(diào)用的時候才會阻塞,收發(fā)客戶消息是不會阻塞的,整個進程或者線程就被充分利用起來,這就是事件驅(qū)動,所謂的reactor模式。