美文网首页
使用SpringIntegration实现分布式锁

使用SpringIntegration实现分布式锁

作者: 皮多堡 | 来源:发表于2020-04-17 15:49 被阅读0次

分布式锁的实现方式有很多种方式,然而spring家族中已经有了比较优雅的实现

1.引入依赖

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-integration</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.integration</groupId>
      <artifactId>spring-integration-redis</artifactId>
    </dependency>

2.配置

spring:
  redis:
    host: localhost
    # 连接超时时间(记得添加单位,Duration)
    timeout: 10000ms
    # Redis默认情况下有16个分片,这里配置具体使用的分片
    # database: 0
    lettuce:
      pool:
        # 连接池最大连接数(使用负值表示没有限制) 默认 8
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
        max-wait: -1ms
        # 连接池中的最大空闲连接 默认 8
        max-idle: 8
        # 连接池中的最小空闲连接 默认 0
        min-idle: 0

/**
 * @author haopeng
 * @date 2020-04-17 14:49
 */
@Configuration
public class RedisLockConfiguration {
    @Bean
    public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
        return new RedisLockRegistry(redisConnectionFactory, "distributed-lock", 5000L);
    }
}

3.编写controller

    @GetMapping("/lock")
    public void lock() throws InterruptedException {
        Lock lock = redisLockRegistry.obtain("lock");
        stock = 1000;
        CountDownLatch countDownLatch = new CountDownLatch(1000);
        ExecutorService pool = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 1000; i++) {
            pool.execute(() -> {
                try {
                    lock.tryLock(1,TimeUnit.SECONDS);
                    stock--;
                    lock.unlock();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        System.out.println("stock= " + stock);
    }

4.测试

  • 不加锁

可以看到返回的结果会出现不一致(预期应该是0)


  • 加锁后

返回了正确的结果


相关文章

网友评论

      本文标题:使用SpringIntegration实现分布式锁

      本文链接:https://www.haomeiwen.com/subject/sfdyvhtx.html