用redis處理高併發是個很常見的方式,因為redis的訪問效率很高(直接訪問記憶體),一般我們會用來處理**一瞬間的併發量。
那如果要使用redis來進行高併發問題的解決的話,應注意以下幾點:
1、首先我們要先知道,我們在儲存時,應使用redis的setnx方法,不應該使用set方法,因為setnx擁有原子操作命令(正確點說法應該是使用setnx,根據其屬性可以保證共享資源的原子性操作),當資源鎖存在不能設定值,則返回0,而當鎖不存在,則設定鎖,返回1; 但如果使用set方法,則會出現在高併發情況下,程序同時獲取鎖狀態為null,同時設定,鎖之間相互覆蓋,但是倆程序仍在併發執行業務**的情況。
2、為了防止死鎖,我們不應直接使用jedis.setnx(lock, 1) 來進行簡單的加鎖,這樣會導致當程序執行出現問題,鎖未釋放,則其他程序永遠處於阻塞狀態,出現死鎖。 為了避免死鎖,我們在加鎖時帶上時間戳,setnx(lock, 時間戳+超時時間),當發現鎖超時了,便可以對鎖進行重置,避免死鎖。
接下來,實際操作!
設定鎖:
//其中currenttimemullis為當前時間、validetime為超時時間,key為資源
//對該資源進行鎖獲取,如果存在鎖則會返回false,不存在則設定值並返回true
boolean lock = redisservice.setnx(key, currenttimemullis+validetime);
//如果不存在並設定了值,則可以直接返回,因為已經獲取資源鎖成功
//否則,則代表存在這個鎖,則進行鎖是否超時的判斷。獲取該資源的鎖時間,用於判斷是否超時了
string keytime = redisservice.get(key);
if((long.valueof(currenttimemullis)-long.valueof(keytime))>validetime)else{
//此時說明該資源鎖被其他執行緒重置或釋放,已不再擁有鎖的釋放權
//結束
利用Redis鎖解決高併發問題
這裡我們主要利用redis的setnx的命令來處理高併發。setnx 有兩個引數。第乙個引數表示鍵。第二個引數表示值。如果當前鍵不存在,那麼會插入當前鍵,將第二個引數做為值。返回 1。如果當前鍵存在,那麼會返回0。建立庫存表 create tablestorage idint 11 unsigned...
利用Redis鎖解決高併發問題
這裡我們主要利用redis的setnx的命令來處理高併發。setnx有兩個引數。第乙個引數表示鍵。第二個引數表示值。如果當前鍵不存在,那麼會插入當前鍵,將第二個引數做為值。返回1。如果當前鍵存在,那麼會返回0。建立庫存表 create table storage id int 11 unsigned...
redis解決併發問題
用redis處理高併發是個很常見的方式,因為redis的訪問效率很高 直接訪問記憶體 一般我們會用來處理 一瞬間的併發量。那如果要使用redis來進行高併發問題的解決的話,應注意以下幾點 1 首先我們要先知道,我們在儲存時,應使用redis的setnx方法,不應該使用set方法,因為setnx擁有原...