使用redis 處理高併發場景

2022-04-11 20:03:34 字數 1465 閱讀 2477

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...