新聞中心
Redis是當下最受歡迎的內(nèi)存數(shù)據(jù)庫,其高性能、持續(xù)時間長占據(jù)重要地位。Redis支持豐富的數(shù)據(jù)類型,當事務處理復雜任務時其作用尤為明顯,特別是在多線程環(huán)境下,為了防止各個線程之間的并發(fā)沖突,無疑需要一個強大的機制來實現(xiàn)有效的并發(fā)控制。于是,Redis鎖機制進入討論。

創(chuàng)新互聯(lián)2013年至今,先為延平等服務建站,延平等地企業(yè),進行企業(yè)商務咨詢服務。為延平企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
Redis鎖機制為基于原子性,底層使用SETNX命令+EXPIRE達到鎖的實現(xiàn),代碼實現(xiàn)如下:
// 獲取鎖的函數(shù)
public static boolean tryGetDistributedLock(Jedis jedis, string lockKey, String requestId, int expireTime) {
// SETNX成功,則獲取鎖成功
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if ("OK".equals(result)) {
return true;
}
return false;
}
// 釋放鎖的函數(shù)
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId){
// 首先獲取鎖對應的value值,檢查是否與requestId相等
// 由于這種方式是WATCH+GETSET+MULTI,因此只有requestId擁有鎖的請求才能修改lockKey
String value = jedis.get(lockKey);
if (StringUtils.isNotEmpty(value) && value.equals(requestId)) {
jedis.del(lockKey);
return true;
}
return false;
}
Redis鎖機制與傳統(tǒng)的系統(tǒng)鎖有一定差異,Redis是獨立的服務器,而且占用計算資源等較低,在多服務器服務器環(huán)境下,不論任何一臺服務器上都可以建立相同的Redis鎖,使得服務器之間的互斥性更加高效。但是,由于網(wǎng)絡的不穩(wěn)定性,可能在建立鎖的過程中發(fā)生網(wǎng)絡故障,比如請求發(fā)出但未收到響應——丟失包現(xiàn)象,導致鎖被未知狀態(tài)。因此,建議用戶在真正應用場景中,配合心跳機制結合實現(xiàn),以盡量避免鎖被未知情況搶占。
Redis鎖機制無疑給許多復雜的事務處理任務提供了非常有效的解決方案,使得互相獨立的線程之間能夠有效的避免沖突,但也許用戶需要在具體的應用場景中結合心跳機制加以完善。
創(chuàng)新互聯(lián)服務器托管擁有成都T3+級標準機房資源,具備完善的安防設施、三線及BGP網(wǎng)絡接入帶寬達10T,機柜接入千兆交換機,能夠有效保證服務器托管業(yè)務安全、可靠、穩(wěn)定、高效運行;創(chuàng)新互聯(lián)專注于成都服務器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認可。
當前文章:Redis鎖機制實現(xiàn)有效的并發(fā)控制(redis鎖機制控制并發(fā))
URL分享:http://www.5511xx.com/article/djieoch.html


咨詢
建站咨詢
