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

Commit 21a02d58 authored by jiangxiulong's avatar jiangxiulong

Lock test

parent 0b9660f9
...@@ -37,6 +37,7 @@ public class SweetConstant { ...@@ -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_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_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_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:"; public final static String REDIS_KEY_SWEET_ANSWER_PHONE = "sweet:answer:phone:";
// 城市投票活动 // 城市投票活动
......
...@@ -25,6 +25,7 @@ public abstract class AbstractRedisUtil { ...@@ -25,6 +25,7 @@ public abstract class AbstractRedisUtil {
/** /**
* 设置redis数据源 * 设置redis数据源
*
* @return * @return
*/ */
abstract AbstractRedisConfig getRedisConfig(); abstract AbstractRedisConfig getRedisConfig();
...@@ -32,7 +33,7 @@ public abstract class AbstractRedisUtil { ...@@ -32,7 +33,7 @@ public abstract class AbstractRedisUtil {
/** /**
* 获取redis队列 * 获取redis队列
*/ */
public StringRedisTemplate getStringRedisTemplate(){ public StringRedisTemplate getStringRedisTemplate() {
return this.getRedisConfig().getStringRedisTemplate(); return this.getRedisConfig().getStringRedisTemplate();
} }
...@@ -764,6 +765,30 @@ public abstract class AbstractRedisUtil { ...@@ -764,6 +765,30 @@ public abstract class AbstractRedisUtil {
return this.getRedisConfig().getRedisTemplateByDb(15).opsForSet().isMember(redisKey, item); 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) { public static void main(String[] args) {
String[] keys = { String[] keys = {
...@@ -775,8 +800,9 @@ public abstract class AbstractRedisUtil { ...@@ -775,8 +800,9 @@ public abstract class AbstractRedisUtil {
System.out.printf("\n[%s] - idx:%s", key, idx); System.out.printf("\n[%s] - idx:%s", key, idx);
} }
} }
private int getIndex(String key){ private int getIndex(String key) {
return MathUtil.getIndex(key,this.getRedisConfig().defaultDb,this.getRedisConfig().totalDbs); return MathUtil.getIndex(key, this.getRedisConfig().defaultDb, this.getRedisConfig().totalDbs);
} }
} }
...@@ -50,6 +50,7 @@ public class JxlMathUtil { ...@@ -50,6 +50,7 @@ public class JxlMathUtil {
// getIndex("kylin:performances:roadShowId:570"); // getIndex("kylin:performances:roadShowId:570");
// getIndex("kylin:order:refund:address"); // getIndex("kylin:order:refund:address");
// getIndex("basicServices:upushList:IOS"); // getIndex("basicServices:upushList:IOS");
getIndex("jxl-lock-test");
// getIndex("basicServices:upushList:Android"); // getIndex("basicServices:upushList:Android");
// getIndex("basicServices:zhengzaiAppVersionsAndroid"); // getIndex("basicServices:zhengzaiAppVersionsAndroid");
// getIndex("basicServices:zhengzaiAppVersionsIos"); // getIndex("basicServices:zhengzaiAppVersionsIos");
......
...@@ -25,6 +25,7 @@ import com.liquidnet.service.sweet.utils.RedisDataUtils; ...@@ -25,6 +25,7 @@ import com.liquidnet.service.sweet.utils.RedisDataUtils;
import com.liquidnet.service.sweet.utils.SweetNewObjectUtil; import com.liquidnet.service.sweet.utils.SweetNewObjectUtil;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bson.Document; import org.bson.Document;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
...@@ -67,7 +68,23 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -67,7 +68,23 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
@Override @Override
public ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId) { public ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId) {
// TODO: 2021/10/26 看情况是否加锁 一个用户整个逻辑单进程 // 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 userId = StringUtils.defaultString((String.valueOf(tokenClaims.get("sub"))), "");
String nickname = StringUtils.defaultString((String.valueOf(tokenClaims.get("nickname"))), ""); String nickname = StringUtils.defaultString((String.valueOf(tokenClaims.get("nickname"))), "");
...@@ -179,7 +196,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -179,7 +196,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(), queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(),
SqlMapping.gets(sqls, sqlsDataA)); SqlMapping.gets(sqls, sqlsDataA));
return ResponseDto.success(sweetIntegralActivityPrizeVo); return ResponseDto.success(sweetIntegralActivityPrizeVo);*/
} }
@Override @Override
......
...@@ -748,4 +748,16 @@ public class RedisDataUtils { ...@@ -748,4 +748,16 @@ public class RedisDataUtils {
.concat(drawId); .concat(drawId);
redisUtil.set(redisKeyDraw, drawVo); 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