简介: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,转载请注明。