1.原理: 當同乙個使用者獲取鎖之後,會讓該使用者一直持有鎖。同樣 的使用者再次獲取,會根據原子性 ,lock返回true。
/** * 獲取鎖(非公平鎖), 預設獲取超時為2分鐘
*/public boolean lock
() /**
* 獲取鎖(非公平鎖), 獲取超時為timeoutseconds秒
*/public boolean lock(int
timeoutseconds) catch
(interruptedexception e) {}
timeout -=sleeptime;
continue
; }
//當分布式程式獲取同乙個鎖時,防止出現以下情況:當已經獲取此鎖的程序(物理機器)實際業務執行時間超過lock_expire_timeout時,此鎖會再被其它程序(物理機器)獲取
string hearbeatflag = rediscacheutil.get(lockname + heartbeat_suffix , string.class
);
if(hearbeatflag!=null
) catch
(interruptedexception e) {}
timeout -=sleeptime;
continue
; }
//鎖到期時間
long expires = system.currenttimemillis() + lock_expire_timeout + 1
; boolean ok =setnx(expires);
if(ok)
//獲取當前鎖資訊
redislockvalue redislockvalue = get
();
if (redislockvalue != null && redislockvalue.getexpiretime() }
//防止飢餓線程出現 採用隨機休眠時間
int sleeptime = random.nextint(100)+100
;
try catch
(interruptedexception e) {}
timeout -=sleeptime;
}//如果已經超時,但只是因為此時快取還有值,因為反序列化異常導致get取不到時,解決死鎖問題
try catch
(interruptedexception e) {}
redislockvalue redislockvalue = get
();
if(redislockvalue==null
)
return
locked;
}
Redis高併發場景應用
步驟1 先登入你的京東賬號,清空以前購物車,然後新增一件商品a,保證你的購物車只有一件商品a。步驟2 退出登入,購物車新增商品b,然後關閉瀏覽器再開啟。請問 購物車的商品b是否存在?步驟3 再次登入你的京東賬號。請問 你的購物車有幾件商品?往購物車加入2件商品 採用hash資料結果,key cart...
redis鎖機制處理高併發
這裡我們主要利用redis的setnx的命令來處理高併發。setnx 有兩個引數。第乙個引數表示鍵。第二個引數表示值。如果當前鍵不存在,那麼會插入當前鍵,將第二個引數做為值。返回 1。如果當前鍵存在,那麼會返回0。建立庫存表 create table storage id int 11 unsign...
redis 高併發處理方式
redis的高併發處理方式 其實redis是不會存在併發問題的,因為他是單程序的,再多的命令都是乙個接乙個地執行的。我們使用的時候,可能會出現併發問題,比如獲得和設定這一對。redis的為什麼 有高併發問題?redis的的出身決定 redis是一種單執行緒機制的nosql資料庫,基於key valu...