快捷搜索: 王者荣耀 脱发

使用redisson解决分布式锁

导入依赖

<!-- redisson -->
<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.15.3 </version>
</dependency>

配置类

配置redisson
package com.atguigu.gmall.common.config;

@Data
@Configuration
@ConfigurationProperties("spring.redis")
public class RedissonConfig {
          
   

    private String host;

    private String password;

    private String port;

    private int timeout = 3000;
    private static String ADDRESS_PREFIX = "redis://";

    /**
     * 自动装配
     */
    @Bean
    RedissonClient redissonSingle() {
          
   
        Config config = new Config();

        if(StringUtils.isEmpty(host)){
          
   
            throw new RuntimeException("host is  empty");
        }
        SingleServerConfig serverConfig = config.useSingleServer()
                .setAddress(ADDRESS_PREFIX + this.host + ":" + port)
                .setTimeout(this.timeout);
        if(!StringUtils.isEmpty(this.password)) {
          
   
            serverConfig.setPassword(this.password);
        }
        return Redisson.create(config);
    }
}

application

spring:
	redis:
	   host: 192.168.200.128
	   port: 6379
	   database: 0
	   timeout: 1800000
	   password:
	   lettuce:
	     pool:
	       max-active: 20 #最大连接数
	       max-wait: -1    #最大阻塞等待时间(负数表示没限制)
	       max-idle: 5    #最大空闲
	       min-idle: 0     #最小空闲

可重入锁

RLock lock = redisson.getLock("anyLock");
// 最常见的使用方法
lock.lock();
// 加锁以后10秒钟自动解锁
// 无需调用unlock方法手动解锁
lock.lock(10, TimeUnit.SECONDS);

// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
          
   
   try {
          
   
     ...
   } finally {
          
   
       lock.unlock();
   }
}

读写锁

RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");
// 最常见的使用方法
rwlock.readLock().lock();
// 或
rwlock.writeLock().lock();
// 10秒钟以后自动解锁
// 无需调用unlock方法手动解锁
rwlock.readLock().lock(10, TimeUnit.SECONDS);
// 或
rwlock.writeLock().lock(10, TimeUnit.SECONDS);

// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);
// 或
boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();
经验分享 程序员 微信小程序 职场和发展