@Slf4j
public abstract class AbstractJobLock {
@Autowired
private StringRedisTemplate stringRedisTemplate;
public String action(String key, int time, Function<String, String> function) {
String version = UUID.randomUUID().toString().replace("-", "");
//原子操作
Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent(key, version, time, TimeUnit.SECONDS);
if (Boolean.TRUE.equals(lock)) {
try {
return function.apply(null);
}catch(Exception e) {
log.error(e.getMessage(), e);
return e.getMessage();
}finally {
delete(key, version);
}
}
return "job is runing";
}
/**
* 只删除自己放置的key
* @param key
* @param version
*/
private void delete(String key, String version) {
String luaScript = "local value = redis.call('get', KEYS[1])\n"
+ "if value == ARGV[1] then\n"
+ " redis.call('del', KEYS[1])\n"
+ " return '1'\n"
+ "else\n"
+ " return '0'\n"
+ "end";
DefaultRedisScript<String> redisScript = new DefaultRedisScript<>();
redisScript.setResultType(String.class);
redisScript.setScriptText(luaScript);
List<String> keys = new ArrayList<>();
keys.add(key);
stringRedisTemplate.opsForValue().getOperations().execute(redisScript, keys, version);
}
}
定时任务分布式锁-redis
最新推荐文章于 2025-02-18 14:23:29 发布