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

SpringBoot集成redis實現(xiàn)分布式鎖的示例代碼

 更新時間:2021年01月24日 10:41:46   作者:菜小菜吃菜  
這篇文章主要介紹了SpringBoot集成redis實現(xiàn)分布式鎖的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1、準(zhǔn)備

使用redis實現(xiàn)分布式鎖,需要用的setnx(),所以需要集成Jedis

需要引入jar,jar最好和redis的jar版本對應(yīng)上,不然會出現(xiàn)版本沖突,使用的時候會報異常redis.clients.jedis.Jedis.set(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;

我使用的redis版本是2.3.0,Jedis使用的是3.3.0

    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>3.3.0</version>
    </dependency>

2、配置參數(shù)

spring:
  redis:
    host: localhost
    port: 6379
    password: root
    timeout: 5000
    # Redis數(shù)據(jù)庫索引(默認(rèn)為0)
    database: 0
    # 連接池最大連接數(shù)(使用負(fù)值表示沒有限制)
    jedis:
      pool:
      # 連接池最大連接數(shù)(使用負(fù)值表示沒有限制)
      max-active: 8
      # 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制)
      max-wait: -1
      # 連接池中的最大空閑連接
      max-idle: 8
      # 連接池中的最小空閑連接
      min-idle: 0
      # 獲取連接時檢測是否可用
      testOnBorrow: true

3、配置JedisPool

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
 
/**
 * Jedis配置項
 * @autho ConnorSong
 * @date 2021/1/21 9:55 上午
 */
@Configuration
@Slf4j
public class JedisPoolCinfigration {
 
  @Bean
  public JedisPoolConfig jedisPoolConfig(@Value("${spring.redis.jedis.pool.max-active}") int maxActive,
                      @Value("${spring.redis.jedis.pool.max-idle}") int maxIdle,
                      @Value("${spring.redis.jedis.pool.min-idle}") int minIdle,
                      @Value("${spring.redis.jedis.pool.max-wait}") long maxWaitMillis,
                      @Value("${spring.redis.jedis.pool.testOnBorrow}") boolean testOnBorrow) {
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMaxTotal(maxActive);
    jedisPoolConfig.setMaxIdle(maxIdle);
    jedisPoolConfig.setMinIdle(minIdle);
    jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
    jedisPoolConfig.setTestOnBorrow(testOnBorrow);
 
    return jedisPoolConfig;
  }
 
  @Bean
  public JedisPool jedisPool(@Value("${spring.redis.host}") String host,
                @Value("${spring.redis.password}") String password,
                @Value("${spring.redis.port}") int port,
                @Value("${spring.redis.timeout}") int timeout, JedisPoolConfig jedisPoolConfig) {
 
    log.info("=====創(chuàng)建JedisPool連接池=====");
    if (StringUtils.isNotEmpty(password)) {
      return new JedisPool(jedisPoolConfig, host, port, timeout, password);
    }
 
    return new JedisPool(jedisPoolConfig, host, port, timeout);
 
  }
}

4、分布式鎖工具類

import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;
 
import java.util.Collections;
 
/**
 * jedis分布式鎖工具類
 * @autho ConnorSong
 * @date 2021/1/20 6:26 下午
 */
@Slf4j
public class JedisLockUtils {
 
  private static final String LOCK_SUCCESS = "OK";
 
  private static final Long RELEASE_SUCCESS = 1L;
  /**
   * 嘗試獲取分布式鎖
   * @param jedis Redis客戶端
   * @param lockKey 鎖
   * @param lockValue value
   * @param expireTime 超期時間(秒)
   * @return 是否獲取成功
   */
  public static boolean tryGetLock(Jedis jedis, String lockKey, String lockValue, int expireTime) {
    log.info("----獲取Jedis分布式鎖----lockKey:{}", lockKey);
 
    try {
      //方案一,具有原子性,并且可以設(shè)置過期時間,避免拿到鎖后,業(yè)務(wù)代碼出現(xiàn)異常,無法釋放鎖
      String result = jedis.set(lockKey, lockValue, new SetParams().nx().ex(expireTime));
      if (LOCK_SUCCESS.equals(result)) {
        return true;
      }
      return false;
      //方案二,setnx()具有原子性,但是有后續(xù)判斷,整體不具有原子性,不能設(shè)置過期時間
//      //setnx(lockkey, 當(dāng)前時間+過期超時時間),如果返回 1,則獲取鎖成功;如果返回 0 則沒有獲取到鎖
//      String value = new Date().getTime() + expireTime + "";
//      if(1 == jedis.setnx(lockKey, value)){
//        return true;
//      }else{
//        String oldExpireTime = jedis.get(lockKey);
//        if(Long.valueOf(oldExpireTime)< new Date().getTime()){
//          //鎖超時,可以獲取鎖重新設(shè)置鎖
//          //計算 newExpireTime = 當(dāng)前時間+過期超時時間,然后 getset(lockkey, newExpireTime) 會返回當(dāng)前 lockkey的值currentExpireTime
//          long newExpireTime = new Date().getTime() + expireTime;
//          String currentExpireTime = jedis.getSet(lockKey, newExpireTime + "");
//          if(currentExpireTime.equals(oldExpireTime)){
//            return true;
//          }
//        }
//        return false;
//      }
    }finally {
      returnResource(jedis);
    }
  }
 
  /**
   * 釋放分布式鎖
   * @param jedis Redis客戶端
   * @param lockKey 鎖
   * @return 是否釋放成功
   */
  public static boolean closeLock(Jedis jedis, String lockKey, String lockValue) {
    log.info("----釋放Jedis分布式鎖----lockKey:{}, lockValue:{}", lockKey, lockValue);
    try {
      String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
      Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(lockValue));
      if (RELEASE_SUCCESS.equals(result)) {
        return true;
      }
      return false;
    }finally {
      returnResource(jedis);
    }
  }
 
  /**
   * 關(guān)閉資源
   * @param jedis
   */
  public static void returnResource(final Jedis jedis){
    if(null != jedis){
      jedis.close();
    }
  }
}

到此這篇關(guān)于SpringBoot集成redis實現(xiàn)分布式鎖的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot redis分布式鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Spring Mvc下實現(xiàn)以文件流方式下載文件的方法示例

    Spring Mvc下實現(xiàn)以文件流方式下載文件的方法示例

    這篇文章主要介紹了Spring Mvc下實現(xiàn)以文件流方式下載文件的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Springboot解決跨域問題方案總結(jié)(包括Nginx,Gateway網(wǎng)關(guān)等)

    Springboot解決跨域問題方案總結(jié)(包括Nginx,Gateway網(wǎng)關(guān)等)

    跨域問題是瀏覽器為了保護(hù)用戶的信息安全,實施了同源策略(Same-Origin?Policy),即只允許頁面請求同源(相同協(xié)議、域名和端口)的資源,本文給大家總結(jié)了Springboot解決跨域問題方案包括Nginx,Gateway網(wǎng)關(guān)等),需要的朋友可以參考下
    2024-03-03
  • Java8與Scala中的Lambda表達(dá)式深入講解

    Java8與Scala中的Lambda表達(dá)式深入講解

    這篇文章主要給大家介紹了關(guān)于Java8與Scala中Lambda表達(dá)式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 線程池中使用spring aop事務(wù)增強(qiáng)

    線程池中使用spring aop事務(wù)增強(qiáng)

    這篇文章主要介紹了線程池中使用spring aop事務(wù)增強(qiáng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • 使用java實現(xiàn)BBS論壇發(fā)送郵件過程詳解

    使用java實現(xiàn)BBS論壇發(fā)送郵件過程詳解

    這篇文章主要介紹了使用java發(fā)送郵件過程詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Mybatis報錯mapkey is required問題及解決

    Mybatis報錯mapkey is required問題及解決

    這篇文章主要介紹了Mybatis報錯mapkey is required問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java?Selenium實現(xiàn)修改打開頁面窗口大小

    Java?Selenium實現(xiàn)修改打開頁面窗口大小

    Selenium是一個強(qiáng)大的自動化測試工具,支持多種編程語言和瀏覽器,本文將詳細(xì)介紹如何使用Java?Selenium來修改打開頁面窗口的大小,需要的可以參考下
    2025-01-01
  • spring boot 利用注解實現(xiàn)權(quán)限驗證的實現(xiàn)代碼

    spring boot 利用注解實現(xiàn)權(quán)限驗證的實現(xiàn)代碼

    這篇文章主要介紹了spring boot 利用注解實現(xiàn)權(quán)限驗證的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • java實現(xiàn)同步回調(diào)的示例代碼

    java實現(xiàn)同步回調(diào)的示例代碼

    同步回調(diào)是一種在調(diào)用代碼中同步執(zhí)行回調(diào)函數(shù)的編程模式,在Java中,通過定義和實現(xiàn)接口來構(gòu)建同步回調(diào),本文就來介紹一下如何實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-09-09
  • 解決idea web項目中out目錄更新不同步問題

    解決idea web項目中out目錄更新不同步問題

    這篇文章給大家介紹了idea web項目中out(maven中是target)目錄更新不同步,導(dǎo)致訪問404的問題,本文給大家分享解決方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09

最新評論

酒泉市| 灵丘县| 那曲县| 盱眙县| 定日县| 五寨县| 新竹市| 城市| 远安县| 九龙坡区| 彭泽县| 普安县| 驻马店市| 明水县| 阿拉善盟| 浮山县| 达州市| 临西县| 太谷县| 临武县| 德阳市| 马尔康县| 河曲县| 湖州市| 平度市| 桦川县| 南涧| 昔阳县| 出国| 临澧县| 饶河县| 伊宁县| 通州区| 石河子市| 辽中县| 青浦区| 酒泉市| 盐山县| 青岛市| 佳木斯市| 海伦市|