java使用redis加锁
1.编写LockUtil工具类import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.connection.RedisStringCommands.SetOption;import org.springframework.data.redis.core.R
·
1.编写LockUtil工具类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisStringCommands.SetOption;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.types.Expiration;
import org.springframework.stereotype.Service;
/**
* LockUtil <br>
*
*/
@Service
public class LockUtil {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* @param lockKey 上锁的key
* @param lockSeconds 上锁的秒数
* @return
*/
public boolean lock(String lockKey, int lockSeconds) {
return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
byte[] key = lockKey.getBytes();
Boolean set = connection.set(key, key, Expiration.seconds(lockSeconds), SetOption.SET_IF_ABSENT);
if (set == null) {
return false;
}
return set;
});
}
public boolean isLock(String lockKey) {
return stringRedisTemplate.opsForValue().get(lockKey)!=null;
}
public boolean clearLock(String lockKey){
return redisTemplate.delete(lockKey);
}
}
2.使用锁
public abstract class AbstractTask {
@Autowired
private LockUtil lockUtil;
/**
* 获取redis锁的key
*
* @return
*/
protected abstract String getLockKey();
protected boolean lock() {
return lockUtil.lock(getLockKey(), 120);
}
protected boolean lockManual() {
return lockUtil.lock(getLockKey(), 299);
}
protected boolean clearLock() {
return lockUtil.clearLock(getLockKey());
}
}
@Component
@Slf4j
@RefreshScope
public class FileCapacityCountTask extends AbstractTask{
@Autowired
private FileCapacityCountService fileCapacityCountService;
@Scheduled(cron = "${batch.verification.schedule.capacity}")
public void task(){
if (!lock()) {
log.info("本实例无需执行定时任务");
return;
}
fileCapacityCountService.fileCapacityCountTask();
}
@Override
protected String getLockKey() {
String today = DateUtil.formatDate(new Date());
return FileCapacityCountTask.class.getSimpleName() + CommonConstant.APPLICATION_NAME + today;
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)