分布式鎖 基于Redis

分布式鎖的實現(基于Redis)

參考:http://www.jb51.net/article/75439.htm?

? ? ? ? http://www.linuxidc.com/Linux/2015-01/111827.htm?

? ? ? ? http://www.tuicool.com/articles/6juqmm7?

?方式一: 基于第三方類庫 redssion?

1.安裝redis

安裝redssion的鎖服務隊redis的版本有要求,要求必須高于2.6版本。關于redis的安裝,請參考redis安裝。

2.redssion庫

redssion的庫添加的pom文件中去。

<dependency>
? ?<groupId>org.redisson</groupId>
? ?<artifactId>redisson</artifactId>
? ?<version>2.1.0</version>
</dependency>

3.測試例子

 Config config = new Config();
? ? ? ? config.useSingleServer().setAddress("ipaddress:6379");
? ? ? ? Redisson redisson = Redisson.create(config);
?? ? ? ?
? ? ? ? for(int i=0;i<5;i++){
? ? ? ? RLock lock = redisson.getLock("testLock");
? ? ? ? lock.lock(10, TimeUnit.SECONDS);//10s超時
? ? ? ? logger.info("the lock client id is client{}",i);
? ? ? ? Thread.sleep(1000);
? ? ? ? logger.info("client{} unlock",i);
? ? ? ? lock.unlock();
? ? ? ? }

4.參考

redisson

?

?

方式二: 自定義代碼實現?



import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;

/**
* redis實現的分布式鎖
*/
public final class Lock {

private static final String LOCK = "redis:lock:%s";
private static final int EXPIRE = 20 * 60;//20分鐘
private static final Logger logger = LoggerFactory.getLogger(Lock.class);

private Lock() {
}


public static Lock getLock() {
return new Lock();
}

/**
* 獲得鎖,超時退出
* @param id
* @param timeout 超時時間(ms)
* @return
*/
public boolean lock(String id, int timeout) {

//這里的Jedis實際上是個代理。代理類JedisCallback,JedisFactoryBean
Jedis jedisProxy = JedisProxy.create();

long lock = 0;

long start = System.currentTimeMillis();

while (lock != 1) {
long now = System.currentTimeMillis();
//判斷超時
if (timeout > 0 && now > start + timeout) {
return false;
}
long timestamp = now + EXPIRE * 1000 + 1;

try {
String key = String.format(LOCK, id);
lock = jedisProxy.setnx(key, String.valueOf(timestamp));
if (lock == 1) {
logger.info("設置redis鎖key成功,lock key=" + key);
jedisProxy.expire(key, EXPIRE);
logger.info("設置redis鎖key過期時間成功,lock key=" + key);
} else {
String s = jedisProxy.get(key);
Long lastLockTime = Long.parseLong(s);

//一個項目部署多個服務,鎖可能已經被相同定時任務的其他進程獲得,則直接返回false
if (jedisProxy.ttl(key)!=-1&&lastLockTime > System.currentTimeMillis()){
logger.info("redis鎖已經被其他服務獲得,lock key=" + key);
return false;
}
/**
* 如果上次鎖定的時間已經過期,則清除key鎖,以便定時任務能夠啟動
* 造成未能釋放的原因主要是jedis.expire(key, EXPIRE);失敗
* 或者是獲取鎖之后,由于程序錯誤或網絡錯誤,unlock未被成功調用
*/
if (jedisProxy.ttl(key)==-1||lastLockTime < System.currentTimeMillis()) {
jedisProxy.del(key);
continue;
}
// this.wait(100);
Thread.sleep(100);
}
} catch (Exception e) {
logger.error("從redis獲取定時任務鎖錯誤,key="+String.format(LOCK, id), e);
return false;
}
}
return true;
}

/**
* 釋放鎖
* @param id
*/
public void unLock(String id) {

//這里的Jedis實際上是個代理。代理類JedisCallback,JedisFactoryBean
Jedis jedisProxy = JedisProxy.create();
String key = String.format(LOCK, id);
jedisProxy.del(key);
}
}

JedisProxy類

/**
* Jedis代理
*/
@Component
public class JedisProxy implements ApplicationContextAware {

private static volatile ApplicationContext ac;

/**
* 創建Jedis 代理
*
* @return
*/
public static Jedis create() {
return ac.getBean(Jedis.class);
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) {
if (ac != null) {
return;
}
synchronized (JedisProxy.class) {
if (ac != null) {
return;
}
ac = applicationContext;
}
}
}

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/wangdaijun/p/5301858.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458164.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458164.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學好Linux決心書

我叫李楊&#xff0c;經過在老男孩教育linux運維班5個月學習后&#xff0c;我一定要達到的的薪水目標是7k,為了達到此目標我將采取如下5大行動或方案&#xff1a;1.每天堅持學習7個小時2.堅持每天跑步1小時3.調整思路 嚴于利己4.讓自己生活更加充實&#xff0c;不在渾渾噩噩5.為…

如何通俗易懂地解釋歐拉公式(e^πi+1=0)?

from&#xff1a;https://www.zhihu.com/question/41134540 http://www.matongxue.com/madocs/8.html

IIS(1)

轉載&#xff1a;http://blog.csdn.net/ce123 IIS音頻總線學習&#xff08;一&#xff09;數字音頻技術 一、聲音的基本概念 聲音是通過一定介質傳播的連續的波。 圖1 聲波重要指標&#xff1a; 振幅&#xff1a;音量的大小周期&#xff1a;重復出現的時間間隔頻率&#xff1a;…

手機屏幕適配原理及實現

為什么80%的碼農都做不了架構師&#xff1f;>>> 手機屏幕是用戶與 App 最直接的交互點 不同的分辨率下用戶對我們的 App 具有明顯的感觀差異&#xff0c;主流分辨率的更新迭代卻又完全獨立于 App 進行。這讓我們想要使 App 在絕大多數主流手機上都保持感觀、體驗的…

【數字圖像處理】傅里葉變換在圖像處理中的應用

from&#xff1a;https://www.cnblogs.com/tenderwx/p/5245859.html 1.理解二維傅里葉變換的定義 1.1二維傅里葉變換 二維Fourier變換: 逆變換&#xff1a; 1.2二維離散傅里葉變換 一個圖像尺寸為MN的 函數的離散傅里葉變換由以下等式給出&#xff1a; 其中 和。其中變量u和…

最好的云備份選項

能夠實現數據備份的方式有很多。在虛擬化技術最為興盛的時期&#xff0c;首選方式是使用數據保護軟件&#xff0c;在hypervisor層進行備份或者復制整臺虛擬機&#xff0c;比如Veeam Backup以及Zerto提供的同步軟件。 對于使用VMware云的IT部門來說&#xff0c;這種方式現在仍然…

求二叉樹中兩個節點的最遠距離

問題定義如果我們把二叉樹看成一個圖&#xff0c;父子節點之間的連線看成是雙向的&#xff0c;我們姑且定義"距離"為兩節點之間邊的個數。寫一個程序求一棵二叉樹中相距最遠的兩個節點之間的距離。計算一個二叉樹的最大距離有兩個情況:情況A: 路徑經過左子樹的最深節…

halcon學習(算子匯總)

from:https://www.cnblogs.com/hanzhaoxin/archive/2013/01/09/2852213.html dev_clear_obj(Objects : : : ) 刪除一個iconic對象 dev_error_var( : : ErrorVar, Mode : ) 定義或取消定義一個錯誤變量 dev_get_exception_data( : : Exception, Name : Value) 獲取異常數據…

Bing Speech Recognition 標記

Bing Speech Services Bing Bing Speech Services provide speech capabilities for Windows and Windows Phone https://msdn.microsoft.com/en-us/library/dn303461.aspx 已失效。 轉載于:https://www.cnblogs.com/zangdalei/p/5312440.html

Source Insight 4.0 最簡單的破解安裝

from&#xff1a;https://blog.csdn.net/biubiuibiu/article/details/78044232 三步完成Source Insight 4.0 破解安裝 下載地址有更新&#xff0c;之前有朋友因潛在的版權問題封禁沒下到&#xff0c;現在更新后可正常使用了。 文末有完全清除上次安裝殘留的方法&#xff0c;…

【原】Spark中Master源碼分析(一)

Master作為集群的Manager&#xff0c;對于集群的健壯運行發揮著十分重要的作用。下面&#xff0c;我們一起了解一下Master是聽從Client&#xff08;Leader&#xff09;的號召&#xff0c;如何管理好Worker的吧。 1.家當&#xff08;靜態屬性&#xff09; 1.設置一個守護單線程的…

XML——XML介紹和基本語法

from&#xff1a;https://blog.csdn.net/gavin_john/article/details/51511180 1.XML歷史 gml(1969)->sgml(1985)->html(1993)->xml(1998) 1969 gml(通用標記語言)&#xff0c;主要目的是要在不同的機器之間進行通信的數據規范1985 sgml(標準通用標記語言)1993 htm…

Tomcat7.0安裝配置

很久沒有通過博客對學習所得進行記錄了。 現在將使用Tomcat的一些經驗和心得寫到這里&#xff0c;作為記錄和備忘。如果有朋友看到&#xff0c;也請不吝賜教。 首先&#xff0c;我個人使用的是apache-tomcat-7.0.27你可以下載使用&#xff0c;前提條件你需要安裝JDK1.6或者1.7都…

TIFF圖像文件格式詳解

from&#xff1a;https://www.cnblogs.com/gywei/p/3393816.html 1 什么是TIFF&#xff1f; TIFF是Tagged Image File Format的縮寫。在現在的標準中&#xff0c;只有TIFF存在&#xff0c; 其他的提法已經舍棄不用了。做為一種標記語言&#xff0c;TIFF與其他文件格式最大的不…

java 抽象工廠模式簡單實例

抽象工廠模式&#xff1a;提供一個創建一系列的相關的或者依賴的對象的接口&#xff0c;無需指定它們的具體實現類&#xff0c;具體的時間分別在子類工廠中產生。 類似于工廠模式&#xff1a;隔離了具體類的生產實現&#xff0c;使得替換具體的工廠實現類很容易。包含有以下模塊…

圖像處理之積分圖應用三(基于NCC快速相似度匹配算法)

from&#xff1a;https://blog.csdn.net/jia20003/article/details/53021614 圖像處理之積分圖應用三&#xff08;基于NCC快速相似度匹配算法&#xff09; 基于Normalized cross correlation(NCC)用來比較兩幅圖像的相似程度已經是一個常見的圖像處理手段。在工業生產環節檢測…

深入淺出地理解機器人手眼標定

from&#xff1a;https://blog.csdn.net/qq_16481211/article/details/79764730 所謂手眼系統&#xff0c;就是人眼鏡看到一個東西的時候要讓手去抓取&#xff0c;就需要大腦知道眼鏡和手的坐標關系。如果把大腦比作B&#xff0c;把眼睛比作A&#xff0c;把手比作C,如果A和B的…

centos 6.5 安裝 mongodb

官方給出的鏈接地址&#xff1a;https://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/ 安裝后重要的日志 win10 上使用mongochef連接不上數據庫 解決方案&#xff1a; 修改 /etc/mongod.conf 將bindIP 改為0.0.0.0 監聽外網轉載于:https://www.cnblogs.com/l…

scala學習資料

1. scala-sbt 構建工具&#xff1a; http://www.scala-sbt.org/0.13/docs/zh-cn/Directories.html 2. 資料&#xff1a; http://www.ibm.com/developerworks/cn/java/j-lo-funinscala2/ https://www.zhihu.com/question/34548588?sortcreated http://nerd-is.in/2013-09/scala…

opencv3/C++ 機器學習-SVM應用實例:藥品(膠囊)識別與分類

from&#xff1a;https://blog.csdn.net/akadiao/article/details/79278072 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/akadiao/article/details/79278072 問題描述&#xff1a; 現對6種不同顏色藥品&#xff08;膠囊…