日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
了解什么是Redis的互斥鎖(什么是redis的互斥鎖)

Redis互斥鎖是分布式系統(tǒng)中一種常見(jiàn)的同步機(jī)制,它保證在特定時(shí)刻,一段代碼只能由一個(gè)線程來(lái)執(zhí)行。它有許多實(shí)現(xiàn),當(dāng)使用Redis作為底層實(shí)現(xiàn)時(shí),可以基于Redis SETNX功能輕松實(shí)現(xiàn)Redis互斥鎖。

成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒(méi)有做好網(wǎng)站,給成都創(chuàng)新互聯(lián)一個(gè)展示的機(jī)會(huì)來(lái)證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來(lái)新的靈感和驚喜。面向用戶友好,注重用戶體驗(yàn),一切以用戶為中心。

SetNX是Redis提供的原子操作,它以鍵/值對(duì)的方式在Redis中設(shè)置一個(gè)值。如果該鍵不存在,則SetNX會(huì)用指定的值來(lái)設(shè)置該鍵,并返回1;否則,SetNX會(huì)失敗,并返回0。由此可見(jiàn),SetNX可以幫助我們實(shí)現(xiàn)Redis的互斥鎖:

1. 在受保護(hù)的代碼中,我們通過(guò)調(diào)用SetNX函數(shù)時(shí),將一個(gè)唯一的鍵名設(shè)置為指定的值。

2. 然后,在受保護(hù)的代碼中,我們可以檢查SetNX的返回值,來(lái)檢查是否獲取到了這把互斥鎖。

3. 如果SetNX函數(shù)返回1,說(shuō)明當(dāng)前線程獲得了互斥鎖,這個(gè)線程可以執(zhí)行鎖保護(hù)的代碼;否則,說(shuō)明獲取互斥鎖失敗,那么當(dāng)前線程不得不重新嘗試獲取互斥鎖來(lái)執(zhí)行受保護(hù)的代碼。

4. 當(dāng)線程執(zhí)行完受保護(hù)的代碼后,就需要釋放互斥鎖,這可以通過(guò)將該鍵/值對(duì)從Redis中刪除實(shí)現(xiàn)。

上述操作是Redis互斥鎖的實(shí)現(xiàn)方式,這樣就可以使用Redis來(lái)實(shí)現(xiàn)輕量級(jí)的分布式鎖。下面是一個(gè)簡(jiǎn)單的實(shí)現(xiàn):

public boolean setLock(string key, String value, long expireTime){

String result = redisTemplate.execute(new RedisCallback() {

@Override

public String doInRedis(RedisConnection connection) throws DataAccessException {

//將key以value設(shè)置到Redis里面(第三個(gè)參數(shù)為超時(shí)時(shí)間,單位為秒)

String setResult = connection.set(key.getBytes(), value.getBytes(),

Expiration.seconds(expireTime), RedisStringCommands.SetOption.ifAbsent());

return setResult;

}

});

// 獲取鎖結(jié)果,成功返回OK

if (“OK”.equals(result)) {

return true;

}

return false;

}

public void unlock(String key,String value){

redisTemplate.execute(new RedisCallback() {

@Override

public Long doInRedis(RedisConnection connection)

throws DataAccessException {

//Lua腳本可以解決上述問(wèn)題,這樣就可以保證在獲取鎖時(shí)設(shè)置的值和解鎖時(shí)是一致的,否則不對(duì)其進(jìn)行解鎖

String script = “if redis.call(‘get’, KEYS[1]) == ARGV[1] then return redis.call(‘del’, KEYS[1]) else return 0 end”;

long result = connection.eval(script.getBytes(), ReturnType.INTEGER, 1, key.getBytes(), value.getBytes());

return result;

}

});

}

以上這段簡(jiǎn)單的代碼就實(shí)現(xiàn)了Redis互斥鎖。Redis使用SETNX函數(shù)進(jìn)行互斥鎖的實(shí)現(xiàn)可以滿足基本的需求,能夠較好的保護(hù)代碼的安全性。但它也有一些缺點(diǎn):鎖的超時(shí)時(shí)間不可控,如果獲得鎖的線程發(fā)生異常,就不能自動(dòng)釋放鎖而被卡住,這就可能造成其它線程難以獲得該鎖而一直處于等待狀態(tài);鎖脆弱,一些意外情況(如Redis服務(wù)器宕機(jī))可能導(dǎo)致鎖被意外釋放。

因此,對(duì)于Redis互斥鎖,最好采用OFFSET模式來(lái)實(shí)現(xiàn),這樣可以避免上述問(wèn)題,也可以實(shí)現(xiàn)更高效的互斥鎖。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專(zhuān)業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


分享文章:了解什么是Redis的互斥鎖(什么是redis的互斥鎖)
地址分享:http://www.5511xx.com/article/cohsoje.html