分布式鎖實現之redis

2021-08-29 18:27:48 字數 976 閱讀 8493

利用redis設計分布式鎖主要用下面這三個命令:

setnx:

setnx key val

當且僅當key不存在時,set乙個key為val的字串,返回1;若key存在,則什麼都不做,返回0。

expire

expire key timeout

為key設定乙個超時時間,單位為second,超過這個時間鎖會自動釋放,避免死鎖。

delete

delete key

刪除key

原理:獲取鎖的時候,使用setnx加鎖,並使用expire命令為鎖新增乙個超時時間,超過該時間則自動釋放鎖,鎖的value值為乙個隨機生成的uuid,通過此在釋放鎖的時候進行判斷。

獲取鎖的時候還設定乙個獲取的超時時間,若超過這個時間則放棄獲取鎖。

釋放鎖的時候,通過uuid判斷是不是該鎖,若是該鎖,則執行delete進行鎖釋放。

public string lockwithtimeout(string locaname,

long acquiretimeout, long timeout)

// 返回-1代表key沒有設定超時時間,為key設定乙個超時時間

if (conn.ttl(lockkey) == -1)

try catch (interruptedexception e)

}} catch (jedi***ception e) finally

}return retidentifier;

}public boolean releaselock(string lockname, string identifier)

retflag = true;

}conn.unwatch();

break;

}} catch (jedi***ception e) finally

}return retflag;

}

分布式鎖之redis實現

當我併發測試時 這tm肯定不行啊,這就超賣了,明明沒這麼多商品,結果還賣出去了。首先,synchronized的確是乙個解決辦法,而且也很簡單,在方法前面加乙個synchronized關鍵字。但是通過壓測,發現請求變的很慢,因為 synchronized就用乙個鎖把這個方法鎖住了,每次訪問這個方法,...

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

redis實現分布式鎖

隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...