Redis學習(xi)筆(bi)記(ji)~Redis并(bing)發(fa)鎖機制
redis客戶端驅(qu)動(dong)有(you)(you)很多(duo),如ServiceStack.Redis,StackExchange.Redis等等,下(xia)(xia)面我使用ServiceStack.Redis為(wei)例,介紹(shao)一(yi)下(xia)(xia)在redis驅(qu)動(dong)中實(shi)現并(bing)(bing)發(fa)鎖的(de)(de)方式,并(bing)(bing)發(fa)就(jiu)是多(duo)線程同(tong)(tong)時訪問和操(cao)作同(tong)(tong)一(yi)個(ge)資源,而對(dui)于redis來(lai)說,如果你多(duo)個(ge)線程共同(tong)(tong)修(xiu)改一(yi)個(ge)key的(de)(de)value,這(zhe)時就(jiu)會出現并(bing)(bing)發(fa),為(wei)了保證數據完整性,這(zhe)時需要使用并(bing)(bing)發(fa)鎖,在各大語言中,都(dou)有(you)(you)自己的(de)(de)實(shi)現方法,無論(lun)的(de)(de)C,C#,java還是sqlserver都(dou)有(you)(you)這(zhe)個(ge)概念!
using (IRedisClient RClient = Lind.DDD.RedisClient.RedisManager.GetClient()) { RClient.Add("zzlKey", 1); // 支持IRedisTypedClient和(he)IRedisClient using (RClient.AcquireLock("lock")) { Console.WriteLine("并發鎖"); var counter = RClient.Get<int>("zzlKey"); RClient.Set("zzlKey", counter + 1); Console.WriteLine(RClient.Get<int>("mykey"));
Thread.Sleep(1000); } }
上面代(dai)碼只是(shi)簡單實現(xian)了并發鎖的功(gong)能,處理(li)過程是(shi)先向redis服務端(duan)申請一把鎖lock,然(ran)后再發指令,我(wo)們知(zhi)道using的作(zuo)用是(shi)作(zuo)用域的概念(nian),即你的鎖在using以后,將會被釋放.