redis多線程避免同時訪問 redis單線程為什么比多線程快?
redis單線程為什么比多線程快?通常來講,單線程處理能力要比多線程差,但是redis為什么就快了,這主要得益于以下幾個原因:1.純內(nèi)存訪問,redis將所有數(shù)據(jù)放在內(nèi)存中,內(nèi)存的響應時長大約為100
redis單線程為什么比多線程快?
通常來講,單線程處理能力要比多線程差,但是redis為什么就快了,這主要得益于以下幾個原因:
1.純內(nèi)存訪問,redis將所有數(shù)據(jù)放在內(nèi)存中,內(nèi)存的響應時長大約為100納秒,這是redis達到每秒萬級別的訪問的重要基礎。
2.非阻塞IO,redis使用epoll作為I/O多路復用技術的實現(xiàn),再加上redis自身的事件處理模型將epoll中的連接、讀寫、關閉都轉(zhuǎn)為事件,不在網(wǎng)絡I/O上浪費過多的時間。
3.單線程避免了線程切換和競態(tài)產(chǎn)生的消耗。
單線程的好處:
1.簡化數(shù)據(jù)結(jié)構(gòu)和算法的實現(xiàn)。
2.避免了線程切換和競態(tài)產(chǎn)生的消耗,對于服務端來說,鎖和線程切換通常是性能殺手。
單線程的問題:對于每個命令的執(zhí)行時間是有要求的。如果某個命令執(zhí)行過程,會造成其他命令的阻塞,對于redis這種高性能的服務來說是致命的,所以redis是面向快速執(zhí)行場景的數(shù)據(jù)庫。
redis讀多線程會出現(xiàn)臟數(shù)據(jù)嗎?
是的,和我們單線程,跑兩個50000,會輸出100000?,F(xiàn)在是兩個并發(fā)線程同時跑在由于并發(fā)造成的數(shù)據(jù)結(jié)果往往不是我們想要的。那么如何解決這個問題呢,Redis已經(jīng)為我們準備好了!你可以看到我RedisHelper中有個方法是 public IDisposable Setnx(string key)。 也可以看到他返回的是IDisposable,證明我們需要手動釋放資源。方法內(nèi)部的 AcquireLock正是關鍵之處,它像redis中索取一把鎖頭,被鎖住的資源,只能被單個線程訪問,不會被兩個線程同時get或者set,這兩個線程一定是交替著進行的,當然這里的交替并不是指你一次我一次,也可能是你多次,我一次,下面看代碼。