摘要:分布式鎖分布式鎖一般用在分布式系統或者多個應用中,用來控制同一任務是否執行或者任務的執行順序。分布式鎖的實現方式使用的和使用的使用的創建節點使用的創建臨時序列節點使用的和來實現分布式鎖如果不存在,設置為當前的值為如果存在,直接返回。
1.分布式鎖
分布式鎖一般用在分布式系統或者多個應用中,用來控制同一任務是否執行或者任務的執行順序。在項目中,部署了多個tomcat應用,在執行定時任務時就會遇到同一任務可能執行多次的情況,我們可以借助分布式鎖,保證在同一時間只有一個tomcat應用執行了定時任務。
2.分布式鎖的實現方式使用redis的setnx()和expire()
使用redis的getset()
使用zookeeper的創建節點node
使用zookeeper的創建臨時序列節點
3.使用redis的setnx()和expire()來實現分布式鎖setnx(key,value) 如果key不存在,設置為當前key的值為value;如果key存在,直接返回。 expire()來設置超時時間
定義注解類:
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Lockable{ // redis緩存key String key(); // redis緩存key中的數據 String value() default ""; // 過期時間(秒),默認為一分鐘 long expire() default 60; }
定時任務增加注解@Lockable:
@Lockable(key = "DistributedLock:dealExpireRecords") public void dealExpireRecords() { }
定義一個aop切面LockAspect,使用@Around處理所有注解為@Lockable的方法,通過連接點確認此注解是用在方法上,通過方法獲取注解信息,使用setIfAbsent來判斷是否獲取分布式鎖,如果沒有獲取分布式鎖,直接返回;如果獲取到分布式鎖,通過expire設置過期時間,并調用指定方法。
@Component @Slf4j @Aspect public class LockAspect { @Autowired private RedisTemplate redisTemplate; @Around("@annotation(com.records.aop.Lockable)") public Object distributeLock(ProceedingJoinPoint pjp) { Object resultObject = null; //確認此注解是用在方法上 Signature signature = pjp.getSignature(); if (!(signature instanceof MethodSignature)) { log.error("Lockable is method annotation!"); return resultObject; } MethodSignature methodSignature = (MethodSignature) signature; Method targetMethod = methodSignature.getMethod(); //獲取注解信息 Lockable lockable = targetMethod.getAnnotation(Lockable.class); String key = lockable.key(); String value = lockable.value(); long expire = lockable.expire(); // 分布式鎖,如果沒有此key,設置此值并返回true;如果有此key,則返回false boolean result = redisTemplate.boundValueOps(key).setIfAbsent(value); if (!result) { //其他程序已經獲取分布式鎖 return resultObject; } //設置過期時間,默認一分鐘 redisTemplate.boundValueOps(key).expire(expire, TimeUnit.SECONDS); try { resultObject = pjp.proceed(); //調用對應方法執行 } catch (Throwable throwable) { throwable.printStackTrace(); } return resultObject; } }4.使用redis的getset()來實現分布式鎖
此方法使redisTemplate.boundValueOps(key).getAndSet(value)的方法,如果返回空,表示獲取了分布式鎖;如果返回不為空,表示分布式鎖已經被其他程序占用
5.使用zookeeper的創建節點node使用zookeeper創建節點node,如果創建節點成功,表示獲取了此分布式鎖;如果創建節點失敗,表示此分布式鎖已經被其他程序占用(多個程序同時創建一個節點node,只有一個能夠創建成功)
6.使用zookeeper的創建臨時序列節點使用zookeeper創建臨時序列節點來實現分布式鎖,適用于順序執行的程序,大體思路就是創建臨時序列節點,找出最小的序列節點,獲取分布式鎖,程序執行完成之后此序列節點消失,通過watch來監控節點的變化,從剩下的節點的找到最小的序列節點,獲取分布式鎖,執行相應處理,依次類推......
本文主要介紹了使用redis和zookeeper實現分布式鎖的處理,也可以關注我的公眾號:不知風在何處,相互溝通,共同進步。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67331.html
摘要:分布式鎖實現方式前言目前幾乎很多大型網站及應用都是分布式部署的,分布式場景中的數據一致性問題一直是一個比較重要的話題。基于數據庫實現分布式鎖基于緩存等實現分布式鎖基于實現分布式鎖。 前言 分布式鎖,是控制分布式系統之間同步訪問共享資源的一種方式 在分布式系統中,常常需要協調他們的動作。如果不同的系統或是同一個系統的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...
摘要:分布式鎖實現方式前言目前幾乎很多大型網站及應用都是分布式部署的,分布式場景中的數據一致性問題一直是一個比較重要的話題。基于數據庫實現分布式鎖基于緩存等實現分布式鎖基于實現分布式鎖。 前言 分布式鎖,是控制分布式系統之間同步訪問共享資源的一種方式 在分布式系統中,常常需要協調他們的動作。如果不同的系統或是同一個系統的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...
摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經常被問到的持久化與恢復實現故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數據恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...
閱讀 933·2021-09-07 09:58
閱讀 1484·2021-09-07 09:58
閱讀 2869·2021-09-04 16:40
閱讀 2501·2019-08-30 15:55
閱讀 2404·2019-08-30 15:54
閱讀 1364·2019-08-30 15:52
閱讀 423·2019-08-30 10:49
閱讀 2598·2019-08-29 13:21