使用redis的演变
1.分布式
锁顾名思义 就是在分布式场景下 多台机器竞争一项资源去加锁
2.设置过期时间
3.锁的续约
4.lua实现原子性
UUID+线程id作为key
5.最后的注意NPC
Network Delay,网络延迟
Process Pause,进程暂停
Clock Drift,时钟漂移
代码
Redisson
Redisson是在redis基础实现的一个分布式工具的集合、其中就包括分布式锁。 文档地址
基础使用
pom依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.7</version>
</dependency>
Redisson客户端
@Bean
public RedissonClient redissonClient(){
// 配置redis信息
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
// 创建 RedissonClient 对象
return Redisson.create(config);
}
简单使用例子
@Autowired
private RedissonClient redissonClient;
@RequestMapping("/lock3")
public String lock3(@RequestParam("account") Long account) throws InterruptedException {
RLock lock = redissonClient.getLock("sync_lock_" + account);
if (!lock.tryLock()) {
return "error";
}
try {
System.out.println("正在执行业务代码");
TimeUnit.SECONDS.sleep(3);
} finally {
lock.unlock();
}
return "ok";
}
使用Redisson来做为加锁也是一个不错的选择、可以弥补redis set...nx这种方式加锁的不足、比如解决了锁可重入、锁重试机制、更新key有效期