redis源碼有必要讀嗎 redis讀多線程會(huì)出現(xiàn)臟數(shù)據(jù)嗎?
redis讀多線程會(huì)出現(xiàn)臟數(shù)據(jù)嗎?是的,和我們單線程,跑兩個(gè)50000,會(huì)輸出100000。現(xiàn)在是兩個(gè)并發(fā)線程同時(shí)跑在由于并發(fā)造成的數(shù)據(jù)結(jié)果往往不是我們想要的。那么如何解決這個(gè)問(wèn)題呢,Redis已經(jīng)為
redis讀多線程會(huì)出現(xiàn)臟數(shù)據(jù)嗎?
是的,和我們單線程,跑兩個(gè)50000,會(huì)輸出100000?,F(xiàn)在是兩個(gè)并發(fā)線程同時(shí)跑在由于并發(fā)造成的數(shù)據(jù)結(jié)果往往不是我們想要的。那么如何解決這個(gè)問(wèn)題呢,Redis已經(jīng)為我們準(zhǔn)備好了!你可以看到我RedisHelper中有個(gè)方法是 public IDisposable Setnx(string key)。 也可以看到他返回的是IDisposable,證明我們需要手動(dòng)釋放資源。方法內(nèi)部的 AcquireLock正是關(guān)鍵之處,它像redis中索取一把鎖頭,被鎖住的資源,只能被單個(gè)線程訪問(wèn),不會(huì)被兩個(gè)線程同時(shí)get或者set,這兩個(gè)線程一定是交替著進(jìn)行的,當(dāng)然這里的交替并不是指你一次我一次,也可能是你多次,我一次,下面看代碼。