redis實現分布式鎖(基於lua指令碼操作)

2021-09-03 02:46:37 字數 2452 閱讀 8205

lua指令碼能保證redis的原子性操作,redis使用springboot的redistemplate

/**

* create by abel

* create date 2018/11/16 11:28

* describe:請輸入專案描述

*/public class redislockservice

/*** 構造器

** @param redistemplate

* @param lockkey 鎖的key

* @param retrytime 獲取鎖的超時時間

*/public redislockservice(redistemplateredistemplate, string lockkey, int retrytime)

/*** 構造器

** @param redistemplate

* @param lockkey 鎖的key

* @param retrytime 獲取鎖的超時時間

* @param expiretime 鎖的有效期

*/public redislockservice(redistemplateredistemplate, string lockkey, int retrytime, int expiretime)

/*** 構造器

** @param redistemplate

* @param lockkey 鎖的key

* @param retrytime 獲取鎖的超時時間

* @param expiretime 鎖的有效期

* @param sleeptime 鎖的睡眠期

*/public redislockservice(redistemplateredistemplate, string lockkey, int retrytime, int expiretime, int sleeptime)

public string getlockkey()

/*** 獲取鎖

** @return

*/private boolean lock()

//這一步是key存在返回false時執行,原因可能是key未刪除或者未到過期時間

//在這個時間(retrytime)內,可以重試多次,如果這個時間內鎖還未釋放,那麼需要主動釋放

if (system.currenttimemillis() - starttime > retrytime)

thread.sleep(sleeptime);

}} catch (interruptedexception e) ", e);

locked = false;

return false;}}

/*** 釋放鎖

** @return

*/private boolean unlock() catch (exception e) ", e);

return false;}}

/*** lua指令碼執行能保證原子性:

* 1.如果key不存在,設定key成功,同時設定過期時間,返回true;

* 2.如果key存在,設定key失敗,返回false;

** @return true-成功,false-失敗

*/private boolean setnx()

/*** 刪除key

** @return true-成功,false-失敗

*/private boolean del()

/*** 匿名類包裝:無返回值

** @param runnable 需要鎖住的執行**

* @return true 獲鎖成功;false 獲鎖失敗

*/public boolean wrap(runnable runnable) catch (exception e) finally

return true;

} else

return false;

}/**

* 匿名類包裝:帶返回值

*/public v wrap(callablecallable) catch (exception e) finally

} else

return null;

}}

使用方法:

string lockkey = "key";

redislockservice lock = new redislockservice(redistemplate, lockkey);

boolean result = lock.wrap(() -> catch (exception e) ", e);

if (e instanceof busines***ception) }}

});if (!result)

基於Redis實現分布式鎖

分布式鎖的基本功能 1.同一時刻只能存在乙個鎖 2.需要解決意外死鎖問題,也就是鎖能超時自動釋放 3.支援主動釋放鎖 分布式鎖解決什麼問題 多程序併發執行任務時,需要保證任務的有序性或者唯一性 準備 redis版本 2.6 redis是主從 sentinel模式 為了高可用 原理 redis2.6之...

基於Redis實現分布式鎖

之前專案中使用redis鎖實現秒殺等一些併發業務,在這裡整理一下基於redis實現分布式鎖的簡單入門例項,記錄一下,便於以後檢視 學習。springboot整合redisson分布式鎖 1 簡介 在分布式系統中存在併發場景,為了解決這一問題,基於redis鎖一定程度可以解決這一問題,但是也有缺點,如...

基於redis實現分布式鎖

實現方式 具備條件 確保鎖可用,必須要滿足一下幾個條件 1 互斥性,任意時刻只有乙個使用者能持有鎖 2 不會產生死鎖,假設某個使用者在持有鎖的期間由於服務崩潰或者其他原因沒有主動釋放鎖,也能保證後續其他使用者可以加鎖 3 加鎖和解鎖必須是同一使用者,b使用者無法解除a使用者加的鎖 實現 1 引入je...