记得上下班打卡 | git大法好,push需谨慎

Commit 21a02d58 authored by jiangxiulong's avatar jiangxiulong

Lock test

parent 0b9660f9
......@@ -37,6 +37,7 @@ public class SweetConstant {
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER = "sweet:integralActivity:DrawIn:activityId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER_KEY = ":userId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO = "sweet:integralActivity:DrawInfo:drawId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_LOCK = "sweet:integralActivity:lock:userId:";
// 答题活动
public final static String REDIS_KEY_SWEET_ANSWER_PHONE = "sweet:answer:phone:";
// 城市投票活动
......
......@@ -25,6 +25,7 @@ public abstract class AbstractRedisUtil {
/**
* 设置redis数据源
*
* @return
*/
abstract AbstractRedisConfig getRedisConfig();
......@@ -32,7 +33,7 @@ public abstract class AbstractRedisUtil {
/**
* 获取redis队列
*/
public StringRedisTemplate getStringRedisTemplate(){
public StringRedisTemplate getStringRedisTemplate() {
return this.getRedisConfig().getStringRedisTemplate();
}
......@@ -764,6 +765,30 @@ public abstract class AbstractRedisUtil {
return this.getRedisConfig().getRedisTemplateByDb(15).opsForSet().isMember(redisKey, item);
}
/**
* 创建锁
* @param key 锁的Key
* @param value 值(随便写毫无意义)
* @param releaseTime 锁过期时间 防止死锁
* @return
*/
public boolean lock(String key, int value, long releaseTime) {
// 尝试获取锁
RedisTemplate<String, Object> redisTemplate = this.getRedisConfig().getRedisTemplateByDb(this.getIndex(key));
Boolean boo = redisTemplate.opsForValue().setIfAbsent(key, value, releaseTime, TimeUnit.SECONDS);
// 判断结果
return boo != null && boo;
}
/**
** 根据key删除锁
** @param key
*/
public void uLock(String key) {
// 删除key即可释放锁
this.getRedisConfig().getRedisTemplateByDb(this.getIndex(key)).delete(key);
}
public static void main(String[] args) {
String[] keys = {
......@@ -775,8 +800,9 @@ public abstract class AbstractRedisUtil {
System.out.printf("\n[%s] - idx:%s", key, idx);
}
}
private int getIndex(String key){
return MathUtil.getIndex(key,this.getRedisConfig().defaultDb,this.getRedisConfig().totalDbs);
private int getIndex(String key) {
return MathUtil.getIndex(key, this.getRedisConfig().defaultDb, this.getRedisConfig().totalDbs);
}
}
......@@ -50,6 +50,7 @@ public class JxlMathUtil {
// getIndex("kylin:performances:roadShowId:570");
// getIndex("kylin:order:refund:address");
// getIndex("basicServices:upushList:IOS");
getIndex("jxl-lock-test");
// getIndex("basicServices:upushList:Android");
// getIndex("basicServices:zhengzaiAppVersionsAndroid");
// getIndex("basicServices:zhengzaiAppVersionsIos");
......
......@@ -25,6 +25,7 @@ import com.liquidnet.service.sweet.utils.RedisDataUtils;
import com.liquidnet.service.sweet.utils.SweetNewObjectUtil;
import org.apache.commons.lang.StringUtils;
import org.bson.Document;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
......@@ -67,7 +68,23 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
@Override
public ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId) {
// TODO: 2021/10/26 看情况是否加锁 一个用户整个逻辑单进程
Map tokenClaims = CurrentUtil.getTokenClaims();
boolean isLock = redisDataUtils.setIntegralDrawLock("1111");
if (!isLock) {
return ResponseDto.failure("太快了");
} else {
try {
System.out.println("获取锁成功,开始执行逻辑");
Thread.sleep(2000);
return ResponseDto.success();
} catch (Exception e) {
System.out.println("程序执行异常{}");
return ResponseDto.failure("异常了");
} finally {
redisDataUtils.delIntegralDrawLock("1111");
System.out.println("执行完毕。释放锁完成;");
}
}
/*Map tokenClaims = CurrentUtil.getTokenClaims();
String userId = StringUtils.defaultString((String.valueOf(tokenClaims.get("sub"))), "");
String nickname = StringUtils.defaultString((String.valueOf(tokenClaims.get("nickname"))), "");
......@@ -179,7 +196,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
return ResponseDto.success(sweetIntegralActivityPrizeVo);
return ResponseDto.success(sweetIntegralActivityPrizeVo);*/
}
@Override
......
......@@ -748,4 +748,16 @@ public class RedisDataUtils {
.concat(drawId);
redisUtil.set(redisKeyDraw, drawVo);
}
public boolean setIntegralDrawLock(String userId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_LOCK
.concat(userId);
return redisUtil.lock(redisKey, 1, 60);
}
public void delIntegralDrawLock(String userId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_LOCK
.concat(userId);
redisUtil.uLock(redisKey);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment