spring boot 下 Redisson分布式锁框架简单使用

在项目中要用到分布式锁,之前都是用jedis去实现的,有很多细节方面都有可能出问题,然后在了解到了redisson之后,决定使用这个成熟的框架去实现分布式锁。

首先引入jar包,除了spring boot的相关jar包,只引这一个就够了

            <dependency>
                <groupId>org.redisson</groupId>
                <artifactId>redisson</artifactId>
                <version>3.9.1</version>
            </dependency>

创建一个redis配置类

@Data
@ConfigurationProperties(prefix ="redisson")
public class RedissonProperties {

	/** redis地址  */
	private String address;
	
	/** 密码  */
	private String password;
	
	// 毫秒
	private int timeout=10000;
	
	private int database=0;
	
	private int connectionPoolSize=150;
	
	private int connectionMiniumIdleSize=10;
	
	// 毫秒
	private int scanInterval=2000;
}

在配置文件中,声明相对应的属性

#redisson的redis地址 单点
redisson.address=redis://redis-master.fn-data-platform:6379
redisson.password=agnYqD2fih

之后写一个config把redisson注册到spring中就可以了,这里使用的是单点redis模式,建议用于锁的redis和用于缓存的redis要分开,用于锁的要保证HA。

/**
 * @program: common-info
 * @description: redisson 配置类
 * @author: lvqiushi
 * @create: 2019-05-05 10:41
 **/
@Configuration
@EnableConfigurationProperties({ RedissonProperties.class })
public class RedissonConfig {
	@Autowired
	private RedissonProperties redissonProperties;

	@Bean
	@ConditionalOnProperty(name = "redisson.address")
	public RedissonClient redissonSingle(){
		Config config = new Config();
		SingleServerConfig serverConfig = config.useSingleServer()
				.setAddress(redissonProperties.getAddress())
				.setTimeout(redissonProperties.getTimeout())
				.setDatabase(redissonProperties.getDatabase())
				.setConnectionPoolSize(redissonProperties.getConnectionPoolSize())
				.setConnectionMinimumIdleSize(redissonProperties.getConnectionMiniumIdleSize())
				.setKeepAlive(true);
		if(StringUtils.isNotEmpty(redissonProperties.getPassword())){
			serverConfig.setPassword(redissonProperties.getPassword());
		}
		return Redisson.create(config);
	}
}

配置完成后,即可开始使用,我写了一个很简单的包装服务类,只用到了RLock可重入锁,redisson的锁有很多种类型,这个大家自己去学习了解。

/**
 *
 * @description: 分布式锁相关服务接口
 * @author: xiucai
 * @create: 2019-05-05
 *
 **/
public interface DistributedLock {

	/**
	 * @Description: 获取锁
	 * @param lockKey
	 * @return: org.redisson.api.RLock
	 * @Author: lvqiushi
	 * @Date: 2019-05-05
	 */
	RLock getLock(String lockKey);
	
	/**
	 * @Description: 使用默认超时时间设置锁 默认时间30s
	 * @param lockKey
	 * @return: org.redisson.api.RLock
	 * @Author: lvqiushi
	 * @Date: 2019-05-05
	 */
	RLock lock(String lockKey);

	/**
	 * @Description: 为锁设置超时时间
	 * @param lockKey
 	 * @param leaseTime 锁自动失效时间 单位:豪秒
	 * @return: org.redisson.api.RLock
	 * @Author: lvqiushi
	 * @Date: 2019-05-05
	 */
	RLock lock(String lockKey, int leaseTime);

	/** 
	 * @Description:  尝试获取锁,在等待时间内获取到锁则返回true,否则返回false,如果获取到锁,在指定超时时间释放锁
	 * @param lockKey
	 * @param waitTime	等到最大时间,强制获取锁
	 * @param leaseTime	 锁自动失效时间
	 * @return: boolean 
	 * @Author: lvqiushi 
	 * @Date: 2019-05-05 
	 */
	boolean tryLock(String lockKey, int waitTime, int leaseTime);

	/** 
	 * @Description: 释放锁
	 * @param lockKey	 
	 * @return: void 
	 * @Author: lvqiushi 
	 * @Date: 2019-05-05 
	 */
	void unlock(String lockKey);
}

然后是服务接口实现类,在实现类中引入在config中声明的bean

@Slf4j
@Component
public class DistributedLockImpl implements DistributedLock {
	@Autowired
	private RedissonClient redissonClient;
	
	@Override
	public RLock getLock(String lockKey) {
		RLock lock = redissonClient.getLock(lockKey);
		return lock;
	}
	
	@Override
	public RLock lock(String lockKey) {
		RLock lock = redissonClient.getLock(lockKey);
		lock.lock();
		return lock;
	}

	@Override
	public RLock lock(String lockKey, int leaseTime) {
		RLock lock = redissonClient.getLock(lockKey);
		lock.lock(leaseTime, TimeUnit.MILLISECONDS);
		return lock;
	}

	@Override
	public boolean tryLock(String lockKey, int waitTime, int leaseTime) {
		RLock lock = redissonClient.getLock(lockKey);
		try {
			return lock.tryLock(waitTime,leaseTime,TimeUnit.MILLISECONDS);
		} catch (InterruptedException e) {
			log.error("", e);
		}
		return false;
	}

	@Override
	public void unlock(String lockKey) {
		RLock lock = redissonClient.getLock(lockKey);
		lock.unlock();
	}
}

再写一个单元测试,用于测试redisson是否真的有效,具体实现就是使用N个线程进行自增num,然后判断num加的是否正确

    @Autowired
    private DistributedLock distributedLock;

    private int num = 0;

    /**
     * @Description: 分布式锁测试方法
     * @param
     * @return: void
     * @Author: lvqiushi
     * @Date: 2020-07-27
     */
    @Test
    public void lockTest() throws Exception {
        int threadCount = 20;
        CountDownLatch latch = new CountDownLatch(20);

        Runnable incr = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 50; i++) {
                    RLock lock = distributedLock.lock("cheat-test-lock-key", 3000);
                    num++;
                    System.out.println(num);
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    if (lock != null) {
                        lock.unlock();
                    }
                }

                latch.countDown();
            }
        };

        for (int i = 0; i < threadCount; i++) {
            new Thread(incr).start();
        }

        // 等所有计数加完
        latch.await();
        assert num == threadCount * 50;
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Spring Boot项目中使用Redisson实现分布式锁,需要按照以下步骤进行: 1. 在项目中引入Redisson依赖,可以在pom.xml文件中添加以下代码: ``` <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.13.3</version> </dependency> ``` 2. 配置Redisson连接,可以在application.yml文件中添加以下代码: ``` redisson: address: redis://127.0.0.1:6379 database: 0 connection-pool-size: 100 password: 123456 ``` 3. 创建RedissonClient对象,可以在Spring Boot项目的启动类中添加以下代码: ``` @Configuration public class RedissonConfig { @Value("${redisson.address}") private String address; @Value("${redisson.password}") private String password; @Value("${redisson.connection-pool-size}") private int connectionPoolSize; @Value("${redisson.database}") private int database; @Bean public RedissonClient redissonClient() { Config config = new Config(); config.useSingleServer().setAddress(address) .setPassword(password) .setConnectionPoolSize(connectionPoolSize) .setDatabase(database); return Redisson.create(config); } } ``` 4. 使用Redisson实现分布式锁,可以在需要加锁的代码中添加以下代码: ``` @Autowired private RedissonClient redissonClient; public void lockMethod() { RLock lock = redissonClient.getLock("lockKey"); try { lock.lock(); // 被锁定的代码 } finally { lock.unlock(); } } ``` 以上代码就是使用Redisson实现分布式锁的基本过程,实际项目中可能还需要根据实际情况进行修改和优化。 ### 回答2: Spring Boot是一款用于快速构建Spring应用程序的开发框架,而Redisson则是一个基于Redis的Java驻留内存数据网格(In-Memory Data Grid)和分布式锁框架。 在Spring Boot使用Redisson来实现分布式锁,需要进行以下几个步骤: 1. 引入Redisson依赖:在pom.xml文件中添加Redisson的依赖。例如: ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.13.3</version> </dependency> ``` 2. 配置Redisson:在application.properties或application.yml文件中配置Redisson连接信息。例如: ```yaml spring: redis: host: 127.0.0.1 port: 6379 password: password ``` 3. 创建RedissonClient Bean:在应用程序的配置类中创建RedissonClient的Bean实例。例如: ```java @Configuration public class RedissonConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private String port; @Bean public RedissonClient redisson() { Config config = new Config(); config.useSingleServer() .setAddress("redis://" + host + ":" + port); return Redisson.create(config); } } ``` 4. 使用分布式锁:在需要进行分布式锁控制的代码块中,通过RedissonClient来获取分布式锁对象,并使用分布式锁对象来实现具体的业务逻辑。例如: ```java @Service public class MyService { @Autowired private RedissonClient redisson; public void doSomething() { RLock lock = redisson.getLock("myLock"); try { lock.lock(); // 执行业务逻辑 } finally { lock.unlock(); } } } ``` 上述代码中,通过调用`redisson.getLock("myLock")`来获取名为"myLock"的分布式锁对象(RLock),然后通过`lock.lock()`来获取锁,执行业务逻辑,最后通过`lock.unlock()`来释放锁。 这样,Spring Boot就可以通过Redisson实现分布式锁的功能了。分布式锁的主要作用是在分布式系统中保证同一时刻只有一个线程能够访问共享资源,避免数据的冲突和不一致。通过使用Redisson,我们可以方便地在Spring Boot应用中实现分布式锁的控制,保证数据的一致性和可靠性。 ### 回答3: Spring Boot是一个快速开发框架,可以简化Java应用程序的开发过程。而Redisson是一个使用Java实现的Redis客户端,它提供了一种简单易用且高效的分布式锁解决方案。 要使用Redisson实现分布式锁,我们需要完成以下几个步骤: 1. 添加Redisson依赖:首先,在Spring Boot项目的pom.xml文件中添加Redisson的依赖。可以通过在<dependencies>标签内添加如下代码来引入Redisson: ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.11.3</version> </dependency> ``` 2. 添加Redis配置信息:在Spring Boot项目的配置文件(如application.properties)中添加Redis的相关配置信息,包括主机名、端口号、密码等。示例配置如下: ```properties spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= ``` 3. 创建RedissonClient Bean:在Spring Boot的配置类中创建一个RedissonClient的Bean,并设置好相应的Redis配置信息。示例代码如下: ```java @Configuration public class RedissonConfig { @Value("${spring.redis.host}") private String redisHost; @Value("${spring.redis.port}") private String redisPort; @Bean public RedissonClient redissonClient() { Config config = new Config(); config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort); return Redisson.create(config); } } ``` 4. 使用Redisson获取锁:在需要加锁的业务方法中,通过RedissonClient的getFairLock方法获取一个公平锁对象,然后使用lock方法获取锁。示例代码如下: ```java @Service public class MyService { @Autowired private RedissonClient redissonClient; public void doSomething() { RLock lock = redissonClient.getFairLock("myLock"); try { lock.lock(); // 执行需要加锁的业务逻辑 } finally { lock.unlock(); } } } ``` 以上就是使用Spring BootRedisson实现分布式锁的基本步骤。通过Redisson提供的锁对象,我们可以在需要时通过lock方法获取锁,然后执行需要加锁的业务逻辑,最后通过unlock方法释放锁。Redisson会自动处理锁的有效期和宕机等异常情况,保证高可用和数据一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值