jedis分布式锁实现(工具类)
//分布式锁相关字段
private static final String LOCK_SUCCESS = "OK";
private static final String SET_IF_NOT_EXIST = "NX";
private static final String SET_WITH_EXPIRE_TIME = "PX";
private static final Long RELEASE_SUCCESS = 1L;
/**
* 尝试获取分布式锁
* @param lockKey 锁
* @param requestId 请求标识
* @param expireTime 超期时间
* @return 是否获取成功
*/
public Boolean tryGetDistributedLock(String lockKey, String requestId, Integer expireTime) {
Jedis jedis = getJedis();
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if (LOCK_SUCCESS.equals(result)) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
/**
* 释放分布式锁
* @param lockKey 锁
* @param requestId 请求标识
* @return 是否释放成功
*/
public Boolean releaseDistributedLock(String lockKey, String requestId) {
Jedis jedis = getJedis();
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
if (RELEASE_SUCCESS.equals(result)) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
实现层代码
String lockKey = "anagroupbuy:" + anaGroupBuyInfo.getId().toString();
String requestId = UUID.randomUUID().toString();
Integer i = 0;
Boolean resultLock;
do{
i++;
//加锁
resultLock = jedisUtil.tryGetDistributedLock(lockKey, requestId, 1000);
if(resultLock == true){
R result = createGroupBuyUntoPayOneOrder(commodityList, Long.parseLong(anaOrderId), anaGroupBuyInfo.getId().toString(), map, untoPayOrderDTO, Uid);
anaGroupBuyInfoService.updateGroupAmounts(anaGroupBuyInfo.getId());
//解锁
jedisUtil.releaseDistributedLock(lockKey, requestId);
if(result.getCode() != 0){
return result;
}else{
break;
}
}else{
sleep(10);
}
}while (i<20);
版权声明:本文为weixin_46553523原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。