国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - 如何操作Redis和zookeeper實現分布式鎖

如何操作Redis和zookeeper實現分布式鎖

2019-11-06 12:47htlr的博客 Redis

這篇文章主要介紹了如何操作Redis和zookeeper實現分布式鎖的相關資料,需要的朋友可以參考下

如何操作Redis和zookeeper實現分布式鎖

在分布式場景下,有很多種情況都需要實現最終一致性。在設計遠程上下文的領域事件的時候,為了保證最終一致性,在通過領域事件進行通訊的方式中,可以共享存儲(領域模型和消息的持久化數據源),或者做全局XA事務(兩階段提交,數據源可分開),也可以借助消息中間件(消費者處理需要能冪等)。通過Observer模式來發布領域事件可以提供很好的高并發性能,并且事件存儲也能追溯更小粒度的事件數據,使各個應用系統擁有更好的自治性。

1.分布式鎖

分布式鎖一般用在分布式系統或者多個應用中,用來控制同一任務是否執行或者任務的執行順序。在項目中,部署了多個tomcat應用,在執行定時任務時就會遇到同一任務可能執行多次的情況,我們可以借助分布式鎖,保證在同一時間只有一個tomcat應用執行了定時任務。

2.分布式鎖的實現方式

  • 使用redis的setnx()和expire()
  • 使用redis的getset()
  • 使用zookeeper的創建節點node
  • 使用zookeeper的創建臨時序列節點

3.使用redis的setnx()和expire()來實現分布式鎖

?
1
2
setnx(key,value) 如果key不存在,設置為當前key的值為value;如果key存在,直接返回。
expire()來設置超時時間

定義注解類:

?
1
2
3
4
5
6
7
8
9
10
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Lockable{
  // redis緩存key
  String key();
  // redis緩存key中的數據
  String value() default "";
  // 過期時間(秒),默認為一分鐘
  long expire() default 60;
}

定時任務增加注解@Lockable:

?
1
2
3
@Lockable(key = "DistributedLock:dealExpireRecords")
public void dealExpireRecords() {
}

定義一個aop切面LockAspect,使用@Around處理所有注解為@Lockable的方法,通過連接點確認此注解是用在方法上,通過方法獲取注解信息,使用setIfAbsent來判斷是否獲取分布式鎖,如果沒有獲取分布式鎖,直接返回;如果獲取到分布式鎖,通過expire設置過期時間,并調用指定方法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@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來監控節點的變化,從剩下的節點的找到最小的序列節點,獲取分布式鎖,執行相應處理,依次類推......

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产精品久久亚洲 | 亚洲高清视频在线 | 亚洲成人播放器 | 日韩欧美在线视频 | 中文字幕视频二区 | 国产精品久久久久久久久久新婚 | 久久久久久久久久久久99 | 日韩欧美的一区二区 | 亚洲视频自拍 | 国产在线一区二区三区 | 精品成人av | 成人免费网站 | 看av的网址| 精品成人在线视频 | 亚洲综合av一区 | 国产精品伊人影院 | 91在线免费看 | 欧美激情亚洲 | 欧美大片高清在线观看平台 | 97视频精品 | 色婷婷av久久久久久久 | 久久精品中文字幕一区二区 | 黄久久久 | 久久久久一区二区三区 | 欧美一区二区三区免费 | 日韩欧美高清视频 | 国产一区二区精品久久 | 久久精品国产99 | 国产一级黄色 | 天天干天天操 | 亚洲精选久久 | 国产精品久久久久久久岛一牛影视 | 亚洲免费视频大全 | 久久国产欧美日韩精品 | 91丨九色丨国产 | 国产精品久久久久久久久久久新郎 | 精品亚洲一区二区三区四区五区 | 亚洲区视频 | 成人在线网站 | 国产成人自拍视频在线 | 国产日韩一区二区 |