一)若专、純內(nèi)存操作
?數(shù)據(jù)存放在內(nèi)存中,內(nèi)存的響應(yīng)時(shí)間大約是?100納秒?蝴猪,這是Redis每秒萬億級別訪問的重要基礎(chǔ)调衰。
二)、單線程操作自阱,避免了頻繁的上下文切換
雖然是采用單線程嚎莉,但是單線程避免了不必要的上下文切換和競爭條件,也不存在多進(jìn)程或者多線程導(dǎo)致的切換而消耗 CPU沛豌;雖然作者認(rèn)為CPU不是瓶頸趋箩,內(nèi)存與網(wǎng)絡(luò)帶寬才是。但實(shí)際測試時(shí)并非如此加派,見上叫确。
三)、采用了非阻塞I/O多路復(fù)用機(jī)制
多路I/O復(fù)用模型是利用 select芍锦、poll竹勉、epoll 可以同時(shí)監(jiān)察多個(gè)流的 I/O 事件的能力,在空閑的時(shí)候娄琉,會把當(dāng)前線程阻塞掉次乓,當(dāng)有一個(gè)或多個(gè)流有 I/O 事件時(shí)吓歇,就從阻塞態(tài)中喚醒,于是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發(fā)出了事件的流)票腰,并且只依次順序的處理就緒的流照瘾,這種做法就避免了大量的無用操作。這里“多路”指的是多個(gè)網(wǎng)絡(luò)連接丧慈,“復(fù)用”指的是復(fù)用同一個(gè)線程析命。加上Redis自身的事件處理模型將epoll中的連接,讀寫逃默,關(guān)閉都轉(zhuǎn)換為了事件鹃愤,不在I/O上浪費(fèi)過多的時(shí)間。?
四)完域、純ANSI C編寫软吐。
不依賴第三方類庫,沒有像memcached那樣使用libevent吟税,因?yàn)閘ibevent迎合通用性而造成代碼龐大凹耙,所以作者用libevent中兩個(gè)文件修改實(shí)現(xiàn)了自己的epoll event loop。微軟的兼容Windows補(bǔ)丁也因?yàn)橥瑯釉虮痪芰恕?/p>
快肠仪,原因之一是Redis多樣的數(shù)據(jù)結(jié)構(gòu)肖抱,每種結(jié)構(gòu)只做自己愛做的事,當(dāng)然比數(shù)據(jù)庫只有Table异旧,MongogoDB只有JSON一種結(jié)構(gòu)快了意述。