最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何操作Redis和zookeeper實現(xiàn)分布式鎖

 更新時間:2017年07月10日 14:28:37   作者:htlr的博客  
這篇文章主要介紹了如何操作Redis和zookeeper實現(xiàn)分布式鎖的相關(guān)資料,需要的朋友可以參考下

如何操作Redis和zookeeper實現(xiàn)分布式鎖

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

1.分布式鎖

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

2.分布式鎖的實現(xiàn)方式

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

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

setnx(key,value) 如果key不存在,設(shè)置為當(dāng)前key的值為value;如果key存在,直接返回。
expire()來設(shè)置超時時間

定義注解類:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Lockable{
  // redis緩存key
  String key();
  // redis緩存key中的數(shù)據(jù)
  String value() default "";
  // 過期時間(秒),默認(rèn)為一分鐘
  long expire() default 60;
}

定時任務(wù)增加注解@Lockable:

 @Lockable(key = "DistributedLock:dealExpireRecords")
 public void dealExpireRecords() {
 }

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

@Component
@Slf4j
@Aspect
public class LockAspect {

  @Autowired
  private RedisTemplate redisTemplate;

  @Around("@annotation(com.records.aop.Lockable)")
  public Object distributeLock(ProceedingJoinPoint pjp) {
    Object resultObject = null;

    //確認(rèn)此注解是用在方法上
    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,設(shè)置此值并返回true;如果有此key,則返回false
    boolean result = redisTemplate.boundValueOps(key).setIfAbsent(value);
    if (!result) {
      //其他程序已經(jīng)獲取分布式鎖
      return resultObject;
    }

    //設(shè)置過期時間,默認(rèn)一分鐘
    redisTemplate.boundValueOps(key).expire(expire, TimeUnit.SECONDS);

    try {
      resultObject = pjp.proceed(); //調(diào)用對應(yīng)方法執(zhí)行
    } catch (Throwable throwable) {
      throwable.printStackTrace();
    }
    return resultObject;
  }
}

4.使用redis的getset()來實現(xiàn)分布式鎖

此方法使redisTemplate.boundValueOps(key).getAndSet(value)的方法,如果返回空,表示獲取了分布式鎖;如果返回不為空,表示分布式鎖已經(jīng)被其他程序占用

5.使用zookeeper的創(chuàng)建節(jié)點node

使用zookeeper創(chuàng)建節(jié)點node,如果創(chuàng)建節(jié)點成功,表示獲取了此分布式鎖;如果創(chuàng)建節(jié)點失敗,表示此分布式鎖已經(jīng)被其他程序占用(多個程序同時創(chuàng)建一個節(jié)點node,只有一個能夠創(chuàng)建成功)

6.使用zookeeper的創(chuàng)建臨時序列節(jié)點

使用zookeeper創(chuàng)建臨時序列節(jié)點來實現(xiàn)分布式鎖,適用于順序執(zhí)行的程序,大體思路就是創(chuàng)建臨時序列節(jié)點,找出最小的序列節(jié)點,獲取分布式鎖,程序執(zhí)行完成之后此序列節(jié)點消失,通過watch來監(jiān)控節(jié)點的變化,從剩下的節(jié)點的找到最小的序列節(jié)點,獲取分布式鎖,執(zhí)行相應(yīng)處理,依次類推......

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

相關(guān)文章

  • 分布式鎖為什么要選擇Zookeeper而不是Redis?看完這篇你就明白了

    分布式鎖為什么要選擇Zookeeper而不是Redis?看完這篇你就明白了

    Zookeeper的機制可以保證分布式鎖實現(xiàn)業(yè)務(wù)代碼簡單,成本低,Redis如果要解決分布式鎖的問題,對于一些復(fù)雜的情況,很難解決,成本較高,這篇文章重點給大家介紹分布式鎖選擇Zookeeper 而不是Redis的理由,一起看看吧
    2021-05-05
  • redis中RDB(Redis Data Base)的機制

    redis中RDB(Redis Data Base)的機制

    本文主要介紹了redis中RDB(Redis Data Base)的機制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Redis內(nèi)存回收策略

    Redis內(nèi)存回收策略

    這篇文章主要介紹了Redis內(nèi)存回收策略,需要的朋友可以參考下
    2007-02-02
  • Redis的數(shù)據(jù)存儲及String類型的實現(xiàn)

    Redis的數(shù)據(jù)存儲及String類型的實現(xiàn)

    這篇文章主要介紹了Redis的數(shù)據(jù)存儲及String類型的實現(xiàn),redis作為k-v數(shù)據(jù)存儲,因查找和操作的時間復(fù)雜度都是O(1)和豐富的數(shù)據(jù)類型及數(shù)據(jù)結(jié)構(gòu)的優(yōu)化,了解了這些數(shù)據(jù)類型和結(jié)構(gòu)更有利于我們平時對于redis的使用,需要的朋友可以參考下
    2022-10-10
  • Win10下 Redis啟動 錯誤1067導(dǎo)致進(jìn)程意外終止的解決方法

    Win10下 Redis啟動 錯誤1067導(dǎo)致進(jìn)程意外終止的解決方法

    這篇文章主要介紹了Win10下 Redis啟動 錯誤1067導(dǎo)致進(jìn)程意外終止的完美解決方案,需要的朋友可以參考下
    2018-01-01
  • redis實現(xiàn)sentinel哨兵架構(gòu)的方法

    redis實現(xiàn)sentinel哨兵架構(gòu)的方法

    哨兵是一個分布式系統(tǒng),可以在一個架構(gòu)中運行多個哨兵(sentinel) 進(jìn)程,這些進(jìn)程使用流言協(xié)議(gossip protocols)來接收關(guān)于Master主服務(wù)器是否下線的信息,這篇文章主要介紹了redis實現(xiàn)sentinel哨兵架構(gòu),需要的朋友可以參考下
    2022-11-11
  • Redis RDB與AOF持久化方式詳細(xì)講解

    Redis RDB與AOF持久化方式詳細(xì)講解

    Redis是基于內(nèi)存的數(shù)據(jù)結(jié)構(gòu)服務(wù)器,保存了大量的鍵值對數(shù)據(jù),所以持久化到磁盤是非常必要的,Redis提供了兩種持久化的方式,分別是RDB和AOF。下面我們看下這兩種持久化方式的具體實現(xiàn)原理
    2022-11-11
  • IDEA初次連接Redis配置的實現(xiàn)

    IDEA初次連接Redis配置的實現(xiàn)

    本文主要介紹了IDEA初次連接Redis配置的實現(xiàn),文中通過圖文步驟介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • Redis分布式鎖解決秒殺超賣問題

    Redis分布式鎖解決秒殺超賣問題

    本文主要介紹了Redis分布式鎖解決秒殺超賣問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 分布式爬蟲處理Redis里的數(shù)據(jù)操作步驟

    分布式爬蟲處理Redis里的數(shù)據(jù)操作步驟

    這篇文章主要介紹了分布式爬蟲處理Redis里的數(shù)據(jù)操作步驟,數(shù)據(jù)分別存入mongodb和mysql數(shù)據(jù)庫,具體內(nèi)容詳情及實例代碼大家參考下本文
    2018-03-03

最新評論

凤翔县| 苗栗市| 尤溪县| 青龙| 临沧市| 石首市| 吉木萨尔县| 南澳县| 抚宁县| 革吉县| 白城市| 富川| 集贤县| 太仆寺旗| 鹿泉市| 高雄市| 枣强县| 广安市| 景德镇市| 微山县| 竹山县| 江源县| 贵定县| 龙海市| 沙雅县| 威信县| 寿阳县| 鹤壁市| 长汀县| 崇左市| 肇东市| 邵东县| 山西省| 南京市| 龙川县| 江永县| 纳雍县| 讷河市| 长丰县| 台北市| 贵德县|