<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一個(gè)強(qiáng)大的分布式鎖框架——Lock4j

          共 5540字,需瀏覽 12分鐘

           ·

          2024-07-26 07:32

          程序員的成長(zhǎng)之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
          關(guān)注


          閱讀本文大概需要 4 分鐘。

          來(lái)自:網(wǎng)絡(luò),侵刪

          推薦一個(gè)程序員編程資料站:
          http://cxyroad.com

          tips:
          2024年IDEA最新激活方法教程,后臺(tái)回復(fù):激活碼

          CSDN免登錄復(fù)制代碼插件下載:CSDN復(fù)制插件

          以下是正文。




          一、簡(jiǎn)介

          Lock4j是一個(gè)分布式鎖組件,它提供了多種不同的支持以滿足不同性能和環(huán)境的需求,基于Spring AOP的聲明式和編程式分布式鎖,支持RedisTemplate、Redisson、Zookeeper。

          二、特性

          • ? 簡(jiǎn)單易用,功能強(qiáng)大,擴(kuò)展性強(qiáng)。
          • ? 支持redission, redisTemplate, zookeeper,可混用,支持?jǐn)U展。
          開(kāi)源地址:
          https://gitee.com/baomidou/lock4j

          三、使用前準(zhǔn)備

          3.1 引入依賴

          <!-- Lock4j -->
          <!-- 若使用redisTemplate作為分布式鎖底層,則需要引入 -->
          <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>lock4j-redis-template-spring-boot-starter</artifactId>
          <version>2.2.4</version>
          </dependency>
          <!-- 若使用redisson作為分布式鎖底層,則需要引入 -->
          <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
          <version>2.2.4</version>
          </dependency>

          3.2 添加redis配置

          spring:
            redis:
          database:0
          # Redis服務(wù)器地址 寫(xiě)你的ip
          host:127.0.0.1
          # Redis服務(wù)器連接端口
          port:6379
          # Redis服務(wù)器連接密碼(默認(rèn)為空)
          password:
          # 連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制  類似于mysql的連接池
          jedis:
          pool:
          max-active:200
          # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制) 表示連接池的鏈接拿完了 現(xiàn)在去申請(qǐng)需要等待的時(shí)間
          max-wait:-1
          # 連接池中的最大空閑連接
          max-idle:10
          # 連接池中的最小空閑連接
          min-idle:0
          # 連接超時(shí)時(shí)間(毫秒) 去鏈接redis服務(wù)端
          timeout: 6000

          四、注解屬性介紹

          package com.baomidou.lock.annotation;

          @Target({ElementType.METHOD})
          @Retention(RetentionPolicy.RUNTIME)
          @Inherited
          @Documented
          public@interfaceLock4j{
          Stringname()default"";

          Class<?extendsLockExecutor> executor()defaultLockExecutor.class;

          String[] keys()default{""};

          longexpire()default-1L;

          longacquireTimeout()default-1L;

          booleanautoRelease()defaulttrue;
          }
          圖片

          五、簡(jiǎn)單使用

          @RestController
          @RequestMapping("/mock")
          publicclassMockController{

          @GetMapping("/lockMethod")
          @Lock4j(keys = {"#key"}, acquireTimeout = 1000, expire = 10000)
          publicResultlockMethod(@RequestParam String key){
          ThreadUtil.sleep(5000);
          returnResult.OK(key);
          }
          }

          打開(kāi)瀏覽器窗口,重復(fù)刷新訪問(wèn):

          http://localhost:8080/mock/lockMethod?key=123

          成功獲得鎖訪問(wèn)結(jié)果:

          {
              "success":true,
          "message":"操作成功!",
          "code":200,
          "result":"123",
          "timestamp":1678866083211
          }

          搶占不到鎖,Lock4j會(huì)拋出

          com.baomidou.lock.exception.LockFailureException: request failed,please retry it.
          異常,通過(guò)全局異常處理返回如下結(jié)果:
          {
              "success":false,
          "message":"操作失敗,request failed,please retry it.",
          "code":500,
          "result":null,
          "timestamp":1678866034929
          }

          六、高級(jí)使用

          6.1 自定義執(zhí)行器Exector

          /**
           * 自定義分布式鎖執(zhí)行器
           *
           * @author: austin
           * @since: 2023/3/15 15:45
           */
          @Component
          publicclassCustomRedissonLockExecutorextendsAbstractLockExecutor{

          @Override
          publicObjectacquire(String lockKey, String lockValue, long expire, long acquireTimeout){
          returnnull;
          }

          @Override
          publicbooleanreleaseLock(String key, String value, Object lockInstance){
          returnfalse;
          }
          }
          在注解上直接指定特定的執(zhí)行器:
          @Lock4j(executor = CustomRedissonLockExecutor.class)

          6.2 自定義分布式鎖key生成器

          /**
           * 自定義分布式鎖key生成器
           *
           * @author: austin
           * @since: 2023/3/15 15:46
           */
          @Component
          publicclassCustomKeyBuilderextendsDefaultLockKeyBuilder{

          publicCustomKeyBuilder(BeanFactory beanFactory){
          super(beanFactory);
          }
          }

          6.3 自定義搶占鎖失敗執(zhí)行策略

          /**
           * 自定義搶占鎖失敗執(zhí)行策略
           *
           * @author: austin
           * @since: 2023/3/15 15:49
           */
          @Component
          publicclassGrabLockFailureStrategyimplementsLockFailureStrategy{

          @Override
          publicvoidonLockFailure(String key, Method method, Object[] arguments){

          }
          }
          默認(rèn)的鎖獲取失敗策略為
          com.baomidou.lock.DefaultLockFailureStrategy.

          6.4 手動(dòng)加鎖釋放鎖

          @Service
          publicclassLockServiceImplimplementsLockService{

          @Autowired
          privateLockTemplate lockTemplate;

          @Override
          publicvoidlock(String resourceKey){

          LockInfolock= lockTemplate.lock(resourceKey,10000L,2000L,CustomRedissonLockExecutor.class);
          if(lock ==null){
          // 獲取不到鎖
          thrownewFrameworkException("業(yè)務(wù)處理中,請(qǐng)稍后再試...");
          }
          // 獲取鎖成功,處理業(yè)務(wù)
          try{
                      doBusiness();
          }catch(Exception e){
          thrownewRuntimeException(e);
          }finally{
                      lockTemplate.releaseLock(lock);
          }
          }

          privatevoiddoBusiness(){
          // TODO 業(yè)務(wù)執(zhí)行邏輯
          }
          }
          <END>

          推薦閱讀:

          阿里這款多級(jí)緩存框架一定要掌握,非常不錯(cuò)!

          Spring Boot + URule 實(shí)現(xiàn)可視化規(guī)則引擎,太優(yōu)雅了!

              
          程序員在線工具站:cxytools.com

          推薦一個(gè)我自己寫(xiě)的工具站:http://cxytools.com,專為程序員設(shè)計(jì),包括時(shí)間日期、JSON處理、SQL格式化、隨機(jī)字符串生成、UUID生成、隨機(jī)數(shù)生成、文本Hash...等功能,提升開(kāi)發(fā)效率。

          ?戳閱讀原文直達(dá)!                                  朕已閱 

          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线韩国精品三级中文hd无码精品 | 国产毛片毛片毛片操逼视频 | 亚洲av无码精品在线观看 | 天堂免费av | 无码精品一区二区三区四区五 |