怎么实现Redis 分布式锁
为什么要用分布式锁,最近在做一个基于springcloud框架的分布式项目,所以如果还是用之前的lock或者是synchronized就达不到效果了,因为后者是针对公用一个内存的,所以我们需要用redis来实现分布式锁。
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-data-21</artifactId>
<version>3.11.0</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.11.0</version>
</dependency>
2.加redis配置
spring:
redis:
host: 47.99.74.204
port: 6379
password: mypassword
timeout: 5000ms
3.写测试程序
@RestController
@RequestMapping("order")
public class orderController {
@Autowired
private RedissonClient redissonClient;
@RequestMapping("test")
public void testSync(){
IntStream.range(0,100).forEach( e ->new Thread(() ->{
RLock rLock = redissonClient.getLock("testSync");
rLock.lock(5, TimeUnit.SECONDS);
try {
System.out.println(System.currentTimeMillis());
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}finally {
rLock.unlock();
}
}).start());
}
}
4.看运行结果
从图片中可以看出我们的时间是一秒一秒的递增的,所以到这里我们就完成了,是不是很简单!
5.说说心得
1.有几个地方还是需要注意,第一个是获取lock的key,是需要在不同的接口用不同的字符串的,不然会冲突,这里的key,相当于redis的key,不能重复。然后就是为锁设定时间,防止死锁,时间的话可以自己根据需求来设定
2.redis实现分布式的命令
a.SETNX key val
当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
b.expire key timeout
为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
c.delete key
删除key,此处用来解锁使用。