Spring Boot 2.1.9 整合 Redisson分佈式鎖

官方參考文檔

redisson-spring-boot-starter 官方文檔

通過YAML文件配置單節點模式

一)、引入Redisson整合Spring Boot依賴

<!-- Spring Boot 相關依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 引入Jedis客戶端依賴 -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.1</version>
</dependency>
<!-- 引入Redisson依賴 -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.12.5</version>
</dependency>

二)、通過YAML文件配置Redisson單節點模式

需要另行創建redisson-single.yml文件,名字可以自定義,但是要和接下來的Bean配置一致

singleServerConfig:
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  # 如果Redis服務端配置有密碼需要替換password的值
  password: null
  subscriptionsPerConnection: 5
  clientName: null
  # 替換爲自己真實Redis服務端連接
  address: "redis://127.0.0.1:6379"
  subscriptionConnectionMinimumIdleSize: 1
  subscriptionConnectionPoolSize: 50
  connectionMinimumIdleSize: 24
  connectionPoolSize: 64
  database: 0
  dnsMonitoringInterval: 5000
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.FstCodec> {}
transportMode: "NIO"

三)、編寫Redisson配置對象

/**
 * Redisson配置類
 *
 * @author MoCha
 * @date 2020/4/25
 */
@Configuration
public class RedissonConfig {
    @Bean(destroyMethod = "shutdown")
    public RedissonClient redisson() throws IOException {
        return Redisson.create(
                Config.fromYAML(new ClassPathResource("redisson-single.yml").getInputStream()));
    }
}

四)、分佈式鎖運用

/**
 * 測試Redisson分佈式鎖
 *
 * @author MoCha
 * @date 2020/4/25
 */
@Slf4j
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RedissonController {
    private final RedissonClient redissonClient;

    @GetMapping("/test")
    public String testLock() {
        RLock coffeeLock = redissonClient.getLock("coffee");
        log.info("進入方法");
        try {
            // 嘗試加鎖,最多等待20秒,上鎖以後5秒自動解鎖
            Future<Boolean> coffeeLockFuture = coffeeLock.tryLockAsync(20, 5, TimeUnit.SECONDS);
            boolean result = coffeeLockFuture.get();
            if (result) {
                log.info("我獲得了鎖");
                Coffee coffee = coffeeService.getById(1);
                if (coffee.getStock() > 0) {
                    coffee.setStock(coffee.getStock() - 1);
                    coffeeService.updateById(coffee);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            log.info("我釋放了鎖");
            coffeeLock.unlock();
        }
        return "success";
    }
}

關於Redisson 中文Wiki文檔的坑

明明都是官方Github的文檔,但是中文語言的Wiki文檔,在單節點模式配置很明顯就問題,

剛開始我是看了中文的Wiki,然後發現報錯,一看源碼才發現SingleServerConfig和

org.redisson.config.Config根本就沒有中文Wiki文檔Yaml文件的一些配置。

然後我又看了英文文檔的,發現兩個文檔的配置有出入。果斷英文文檔的配置是可以使用

的。配置後確實沒問題。不得不說,這個坑,會把一開始看中文文檔的朋友給整懵了。

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "pingTimeout" (class org.redisson.config.SingleServerConfig), not marked as ignorable (25 known properties: "timeout", "subscriptionsPerConnection", "keepAlive", "sslKeystorePassword", "retryInterval", "retryAttempts", "idleConnectionTimeout", "sslTruststorePassword", "sslEnableEndpointIdentification", "address", "sslTruststore", "username", "connectTimeout", "subscriptionConnectionPoolSize", "password", "sslProvider", "tcpNoDelay", "connectionMinimumIdleSize", "subscriptionConnectionMinimumIdleSize", "sslKeystore", "pingConnectionInterval", "clientName", "connectionPoolSize", "database", "dnsMonitoringInterval"])
 at [Source: (StringReader); line: 3, column: 20] (through reference chain: org.redisson.config.Config["singleServerConfig"]->org.redisson.config.SingleServerConfig["pingTimeout"])

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章