分布式鎖是控制分布式系統之間同步訪問共享資源的一種方式。在分布式系統中,常常需要協調他們的動作。如果不同的系統或是同乙個系統的不同主機之間共享了乙個或一組資源,那麼訪問這些資源的時候,往往需要互斥來防止彼此干擾來保證一致性,在這種情況下,便需要使用到分布式鎖。
先來看看一些redis的基本命令:
setnx key value
如果key不存在,就設定key對應字串value。在這種情況下,該命令和set一樣。當key已經存在時,就不做任何操作。setnx是」set if not exists」。
expire key seconds
設定key的過期時間。如果key已過期,將會被自動刪除。
del key
刪除key
package com.provider.demo.comment;
/** * @description
* @author fengwen
* @date 2020/1/23 11:37
* @version v1.0
*/import lombok.extern.slf4j.slf4j;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.data.redis.core.stringredistemplate;
import org.springframework.stereotype.component;
import org.springframework.util.stringutils;
/** * redis分布式鎖
* @author fengwen
*/@component
@slf4j
public
class
redislock
//假設currentvalue=a 接下來併發進來的兩個執行緒的value都是b 其中乙個執行緒拿到鎖,除非從始至終所有都是在併發(實際上這中情況是不存在的),只要開始時有資料有先後順序,則分布式鎖就不會出現「多賣」的現象
string currentvalue = redistemplate.
opsforvalue()
.get
(key)
;//如果鎖過期 解決死鎖if(
!stringutils.
isempty
(currentvalue)
&& long.
parselong
(currentvalue)
< system.
currenttimemillis()
)}//拿到鎖的就有執行權力,拿不到的只有重新再來,重新再來只得是讓使用者手動繼續搶單
return
false;}
/** * 解鎖
* @param key
* @param value
*/public
void
unlock
(string key, string value)
}catch
(exception e)
", e);}
}}
分布式鎖 使用Redis實現分布式鎖
關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...
redis實現分布式鎖
隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...
redis實現分布式鎖
分布式鎖可以基於很多種方式實現,比如zookeeper redis.不管哪種方式,他的 基本原理是不變的 用乙個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識。1 使用redis的setnx命令實現分布式鎖 1 實現的原理 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶...