springboot的RedisTemplate实现分布式锁
springboot的RedisTemplate实现分布式锁背景:通过synchronized创建一个同步代码块,保证多线程并发下数据的准确,这是一个最简单的线程安全的例子。但这是JVM层面上的数据安全。当下我们的系统,为了安全性、可靠性一般是部署在多台服务器的,或者是在k8s上部署了多个节点。这个时候JVM层面的数据安全就不适用了,那么可以通过redis实现分布式的线程安全的业务。直接上代码!@
·
springboot的RedisTemplate实现分布式锁
背景:通过synchronized创建一个同步代码块,保证多线程并发下数据的准确,这是一个最简单的线程安全的例子。但这是JVM层面上的数据安全。当下我们的系统,为了安全性、可靠性一般是部署在多台服务器的,或者是在k8s上部署了多个节点。这个时候JVM层面的数据安全就不适用了,那么可以通过redis实现分布式的线程安全的业务。
直接上代码!
@Slf4j
public class RedisLock {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String REQUEST_CONTAINER = "TEST_LOCK";
/**
* 锁的过期时间可设置的长一些(业务执行完就释放了),至少要比预计的业务执行时间长(防止业务没执行完就释放了锁)
*/
private static final long EXPIRE_TIME = 300L;
public void lock(String lockName) {
String key = REQUEST_CONTAINER + lockName;
boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(key,1);
if (aBoolean) {
try {
log.info("====================进入锁:{}==================",key);
// 这里设置锁的过期时间和finally代码块都是为了防止死锁(JVM 崩溃,操作系统死掉等,finally是不会执行的)
redisTemplate.expire(key,EXPIRE_TIME, TimeUnit.SECONDS);
/*已进入业务*/
// ********业务逻辑处理中****** //
log.info("处理业务中");
// *******业务逻辑处理结束****** //
}catch (Exception e) {
log.info("出现了点小问题-{}", e.getMessage());
} finally {
// 业务异常,手动释放锁
redisTemplate.delete(key);
log.info("------------redis锁释放成功-----------");
}
}else {
log.info("获取不到锁");
}
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)