简介:redis官方推荐-分布式锁最佳实践
- 原生代码+redis实现分布式锁使用比较复杂,且有些锁续期问题更难处理
- 官方推荐方式:https://redis.io/topics/distlock
- 多种实现客户端框架
- Redisson官方中文文档:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95
- 聚合工程锁定版本,common项目添加依赖(多个服务都会用到分布式锁)
添加pom
<!--分布式锁-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.10.1</version>
</dependency> 创建一个AppConfig类
import lombok.Data;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@Data
public class AppConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private String redisPort;
@Value("${spring.redis.password}")
private String redisPwd;
/**
* 配置分布式锁的redisson
* @return
*/
@Bean
public RedissonClient redissonClient(){
Config config = new Config();
//单机方式
config.useSingleServer().setPassword(redisPwd).setAddress("redis://"+redisHost+":"+redisPort);
//集群
//config.useClusterServers().addNodeAddress("redis://192.31.21.1:6379","redis://192.31.21.2:6379")
RedissonClient redissonClient = Redisson.create(config);
return redissonClient;
}
}
来看实现类
@GetMapping("lock")
public JsonData testLock() {
RLock lock = redissonClient.getLock("lock:coupon:1");
//阻塞等待
//lock.lock(10,TimeUnit.MILLISECONDS);
lock.lock();
try {
log.info("加锁成功,处理业务逻辑。。。。。。" + Thread.currentThread().getId());
TimeUnit.SECONDS.sleep(20);
} catch (Exception e) {
} finally {
log.info("解锁成功,其他线程可以进去。。。。。。" + Thread.currentThread().getId());
lock.unlock();
}
return JsonData.buildSuccess();
} 本文作者为DBC,转载请注明。