栗子:
这是我在开发中遇到的,希望对读者有所帮助
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
/**
*新版本处理还车
*
* */
@Override
public BaseResult changeOrderInfoNew(RestoreCarOrderStatusChangeDTO dto) {
try {
//初始化redis
Jedis jedis = new Jedis(host, port);
String lockKey = "/nservice/restoreCar/updateOrderInfo"+soNo;
String requestId =UUidUtils.getUUID();
int expireTime = 5000;
boolean tryGetDistributedLock = LockUtils.tryGetDistributedLock(jedis, lockKey, requestId, expireTime);
logger.info(tryGetDistributedLock+"");
if(tryGetDistributedLock){
//业务逻辑处理
}
}catch (Exception e) {
logger.error("异常信息");
throw new ServiceBizException(e);
} finally {
long runningTime = System.currentTimeMillis() - startTime;
logger.info("============还车地址修改接口end,耗时:" + runningTime + "ms ===========");
}
工具类:
package com.nio.dms.invoices.utils;
import java.util.Collections;
import redis.clients.jedis.Jedis;
/**
* 处理并发(基于jedis)
* @description:
* @author:liulei
* @date:2018年12月14日
*/
public class LockUtils {
private static final Long RELEASE_SUCCESS = 1L;
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";
/**
* 获取jedis锁
* @param jedis jedis
* @param lockKey 建议 用action全路径+单号
* @param requestId 32 uuid
* @param expireTime 锁的失效时间 毫秒
* @return
*/
public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if (LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
}
/**
* 释放锁
* @param jedis
* @param lockKey
* @param requestId
* @return
*/
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
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 true;
}
return false;
}
}