redission java_Java注解如何基于Redission實現分布式鎖

這篇文章主要介紹了Java注解如何基于Redission實現分布式鎖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1、定義注解類

@Target({ ElementType.METHOD })

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface DistributedLock {

//鎖名稱

String lockName() default "";

//釋放時間

long releaseTime() default 5*1000;

//時間單位

TimeUnit timeUnit() default TimeUnit.MILLISECONDS;

}

2、定義切面攔截 DistributedLock 注解

@Aspect

@Component

@Slf4j

public class DistributedLockAspect {

@Autowired

private RedissonClient redissonClient;

//這里需要修改對應的包名

@Pointcut("@annotation(com.utils.annotation.DistributedLock)")

public void RlockAspect() {

}

@Around("RlockAspect()")

public Object arround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

Object object = null;

RLock lock = null;

log.info("rlockAspect start ");

try {

DistributedLock rlockInfo = getRlockInfo(proceedingJoinPoint);

String lockKey = getLocalKey(proceedingJoinPoint, rlockInfo);

lock = redissonClient.getLock(lockKey);

if (lock != null) {

final boolean status = lock.tryLock(rlockInfo.releaseTime(), rlockInfo.timeUnit());

if (status) {

object = proceedingJoinPoint.proceed();

}

} else {

log.info("未獲取到鎖:{}", lockKey);

}

} finally {

// 當前線程獲取到鎖再釋放鎖

if (lock != null && lock.isHeldByCurrentThread()) {

lock.unlock();

}

}

return object;

}

public DistributedLock getRlockInfo(ProceedingJoinPoint proceedingJoinPoint) {

MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();

return methodSignature.getMethod().getAnnotation(DistributedLock.class);

}

/**

* 獲取redis lock key

*

* @param proceedingJoinPoint

* @return

*/

public String getLocalKey(ProceedingJoinPoint proceedingJoinPoint, DistributedLock rlockInfo) {

StringBuilder localKey = new StringBuilder("Rlock");

final Object[] args = proceedingJoinPoint.getArgs();

String businessNo = "";

// 如果沒有設置鎖值

if (StringUtils.isNotEmpty(rlockInfo.lockName())) {

businessNo = rlockInfo.lockName();

} else {

MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();

Class[] parameters = methodSignature.getParameterTypes();

String methodName = methodSignature.getMethod().getName();

if (parameters != null) {

for (int i = 0; i < parameters.length; i++) {

Class parameter = parameters[i];

if (parameter.getSimpleName().equals("NDevice")) {

NDevice de = (NDevice) args[i];

businessNo = de.getUuid() + methodName;

}

if (parameter.getSimpleName().equals("FrameBean")) {

FrameBean de = (FrameBean) args[i];

businessNo = de.getColumn1() + methodName;

}

}

// 如果沒有獲取到業務編號,則使用方法簽名

if (StringUtils.isEmpty(businessNo)) {

businessNo = methodName;

}

}

}

return businessNo;

}

}

3、使用方法:在需要用分布式鎖的方法上面加 @DistributedLock 注解即可

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

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

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

相關文章

Spring Security源碼分析四:Spring Social實現微信社交登錄

2019獨角獸企業重金招聘Python工程師標準>>> 社交登錄又稱作社會化登錄&#xff08;Social Login&#xff09;&#xff0c;是指網站的用戶可以使用騰訊QQ、人人網、開心網、新浪微博、搜狐微博、騰訊微博、淘寶、豆瓣、MSN、Google等社會化媒體賬號登錄該網站。 前言…

jdbc開發優缺點

1&#xff09;優點&#xff1a;簡單易學,上手快,非常靈活構建SQL&#xff0c;效率高 2&#xff09;缺點&#xff1a;代碼繁瑣&#xff0c;難以寫出高質量的代碼&#xff08;例如&#xff1a;資源的釋放&#xff0c;SQL注入安全性等&#xff09; 開發者既要寫業務邏輯&#xff0…

java numberformat 方法_Java NumberFormat parse()用法及代碼示例

parse(str)方法是java.text.NumberFormat的內置方法&#xff0c;該方法從給定字符串的開頭解析文本以產生數字。該方法可能不使用給定字符串的整個文本用法:public Number parse?(String str)參數&#xff1a;該函數接受一個字符串str&#xff0c;其開頭應進行分析。返回值&am…

hibernate開發優缺點

1&#xff09;優點&#xff1a;不用寫SQL&#xff0c;完全以面向對象的方式設計和訪問&#xff0c;不用管底層具體數據庫的語法&#xff0c;&#xff08;例如&#xff1a;分頁&#xff09;便于理解。 2&#xff09;缺點&#xff1a;處理復雜業務時&#xff0c;靈活度差, 復雜的…

求方程的解 Solve the Equation

為什么80%的碼農都做不了架構師&#xff1f;>>> 問題&#xff1a; Solve a given equation and return the value of x in the form of string "x#value". The equation contains only , - operation, the variable x and its coefficient. If there is …

[C#學習] DataAdapter.Fill()分頁

查詢結果分頁是以較小數據子集&#xff08;即頁&#xff09;的形式返回查詢結果的過程。 它通常用于以易于管理的小塊形式向用戶顯示結果。DataAdapter 提供了通過 Fill 方法的重載來僅返回一頁數據的功能。 但是&#xff0c;對于大量的查詢結果&#xff0c;它可能并不是首選的…

java流讀取字符串_javaIO之字符流是怎么讀取的?

最近在看io相關的知識&#xff0c;遇到一些小問題&#xff0c;以下有例子來說明問題&#xff1a;比如&#xff1a;12345 是一個十進制數根據ASCII碼找到是 &#xff1a;二進制 00110001 00110010 00110011 00110100 00110101十進制4950515253十六進制 0x310x320x330x340x35文件…

什么是mybatis,mybatis有什么特點

jdbc開發優缺點&#xff1a;http://blog.csdn.net/zengmingen/article/details/51180796 hibernate開發優缺點&#xff1a;http://blog.csdn.net/zengmingen/article/details/51180805 1&#xff09;基于上述二種支持&#xff0c;我們需要在中間找到一個平衡點呢&#xff1f;結…

簡易RPC框架實現

寫在最前面 PRC(Remote Procedure Call) 遠程過程調用。通俗的講就是程序通過RPC框架調用遠程主機的方法就如同調用本地方法一樣。Dubbo就是這樣一個Rpc框架&#xff0c;本文主要參考Dubbo的設計思路&#xff0c;簡易實現了Rpc框架。 本文涉及到知識點包括&#xff1a; Jdk 動態…

kafka java獲取topic_通過編程方式獲取Kafka中Topic的Metadata信息

如果我們需要通過編程的方式來獲取到TopicMetadataRequest請求到 def findLeader(topic: String): Unit {val consumer connect("www.iteblog.com", 9092)val req TopicMetadataRequest(TopicMetadataRequest.CurrentVersion,0, kafkaGroupId, List(topic))val to…

redis java 遍歷key_java遍歷讀取整個redis數據庫實例

redis提供了靈活的數據查詢方式&#xff0c;最牛的就是key的搜索支持正則表達式。jedis.keys(“*”);表示搜索所有keyjedis.keys(“abc*”)表示搜索開頭為abc的key數據遍歷了key就能遍歷到value。其實就是一個setRedisDO rd new RedisDO();rd.open();Set s rd.jedis.keys(&qu…

js學習

為什么80%的碼農都做不了架構師&#xff1f;>>> /* my code */ var gArrSpell [ 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 999999, AAAA, bbbb, cccc, dddd, eeee, fffff ];var gArrSplDmg [11,12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24…

代碼在eclipse下不報錯,在doc命令行下報錯--jar file和runable jar file

今天開發一個小工具&#xff0c;引用了Log4j&#xff0c;來記錄日志&#xff0c;在eclipse下運行&#xff0c;代碼正常&#xff0c;打包成jar放到doc命令行下運行報錯&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/…

gradle java ide_使用Gradle構建Java項目

使用Gradle構建Java項目這個手冊將通過一個簡單的Java項目向大家介紹如何使用Gradle構建Java項目。我們將要做什么&#xff1f;我們將在這篇文檔航中創建一個簡單的Java項目&#xff0c;然后使用Gradle構建它。需要準備什么&#xff1f;預留15分鐘空閑時間一件稱手的兵器(你最喜…

小馬激活軟件下載,當心偽小馬,有病毒

官方的小馬激活軟件已經停止更新了&#xff0c;下文是官方停更公告。 http://www.pccppc.com/xiaomajihuo-html 所以小馬oem7以后的都不是官方的&#xff0c;包含病毒。重裝系統后&#xff0c;一般是先激活系統&#xff0c;再安裝殺毒軟件&#xff0c;這就給“偽小馬激活工具”…

truncate,delete,drop之間的區別

TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同&#xff1a;二者均刪除表中的全部行。 但 TRUNCATE TABLE 比 DELETE 速度快&#xff0c;且使用的系統和事務日志資源少。 DELETE 語句每次刪除一行&#xff0c;并在事務日志中為所刪除的每行記錄一項。 TRUNCATE…

三張圖搞懂JavaScript的原型對象與原型鏈

對于新人來說&#xff0c;JavaScript的原型是一個很讓人頭疼的事情&#xff0c;一來prototype容易與__proto__混淆&#xff0c;二來它們之間的各種指向實在有些復雜&#xff0c;其實市面上已經有非常多的文章在嘗試說清楚&#xff0c;有一張所謂很經典的圖&#xff0c;上面畫了…

python partial_如何在python多處理模塊中使用partial函數?

下面是我如何解決這個問題的一個簡單例子from functools import partialfrom multiprocessing import Pooldef VariadicLifter(func, args):return func(*args)def func(x,y,z,a):return x2*y3*z4*aif __name__ __main__:func_ partial( func, 500, 1007)lfunc_ partial( Va…

Mybatis中resultMap

MyBatis中在查詢進行select映射的時候&#xff0c;返回類型可以用resultType&#xff0c;也可以用resultMap&#xff0c;resultType是直接 表示返回類型的&#xff0c;而resultMap則是對外部ResultMap的引用&#xff0c;但是resultType跟resultMap不能同時存在。 1.resultType …

超簡單的mysql多實例布置

一、基本概念mysql下載&#xff1a;http://mirrors.sohu.com/mysql/MySQL-5.5/1、MySQL多實例就是在一臺機器上面開啟多個不同的端口&#xff0c;運行多個MySQL服務進程。這些MySQL多實例公用一套安裝程序&#xff0c;使用不同的(也可以是相同的)配置文件&#xff0c;啟動程序&…