springboot + redistemplate 实现锁的方案
1、通过set命令设置锁 2、判断返回结果是否是OK 1)Nil,获取失败,结束或重试(自旋锁) 2)OK,获取锁成功 执行业务 释放锁,DEL 删除key即可 3、异常情况,服务宕机。超时时间EX结束,会自动释放锁 代码清晰简洁 废话不多说直接上demo
package com.example.demo.controller;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.concurrent.TimeUnit;
/**
* Description: demo <br>
*
* @author Liang lp
* Date: 2019/12/13 12:27 <br>
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class demo {
private static final Logger log = LoggerFactory.getLogger(demo.class);
@Autowired
RedisTemplate redisTemplate;
@Test
public void test() {
String key = "test";
//创建锁
boolean isLock = lock(key, 1, 50);
// 判断是否获取锁
if (!isLock) {
//获取所失败
log.info("获取所失败 ");
return;
}
try {
log.info("获取锁成功,开始执行逻辑");
//模拟程序执行
Thread.sleep(2000);
} catch (Exception e) {
log.error("程序执行异常{}", e);
} finally {
// 释放锁
deleteLock(key);
log.info("执行完毕。释放锁完成;");
}
}
/**
* 创建锁
*
* @param key 锁的Key
* @param value 值(随便写毫无意义)
* @param releaseTime 锁过期时间 防止死锁
* @return
*/
public boolean lock(String key, int value, long releaseTime) {
// 尝试获取锁
Boolean boo = redisTemplate.opsForValue().setIfAbsent(key, value, releaseTime, TimeUnit.SECONDS);
// 判断结果
return boo != null && boo;
}
/**
* 根据key删除锁
*
* @param key
*/
public void deleteLock(String key) {
// 删除key即可释放锁
redisTemplate.delete(key);
}
}```
