定时任务分布式锁-redis

@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);
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值