Ver código fonte

加入redis锁

简德馨 2 anos atrás
pai
commit
7671926e8b

+ 48 - 0
src/main/java/org/springblade/common/utils/RedisTool.java

@@ -0,0 +1,48 @@
+package org.springblade.common.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 第一种分布式锁
+ */
+@Component
+public class RedisTool {
+
+    @Resource
+    RedisTemplate redisTemplate;
+
+    private final Logger log = LoggerFactory.getLogger(this.getClass());
+
+    // 获取锁之前的超时时间(获取锁的等待重试时间)
+    private long acquireTimeout = 20000;
+    // 获取锁之后的超时时间(防止死锁)
+    private int timeOut = 60*10;
+
+    /**
+     * 获取分布式锁
+     * @return 锁标识
+     */
+    public boolean getRedisLock(String lockName, String val) {
+        Boolean b = redisTemplate.opsForValue().setIfAbsent(lockName, val, timeOut, TimeUnit.SECONDS);
+        if(b){
+            return true;
+        }else{
+            log.info("lock err!");
+        }
+        return false;
+    }
+    /**
+     * 释放分布式锁
+     * @param lockName 锁名称
+     */
+    public void unRedisLock(String lockName) {
+        redisTemplate.delete(lockName);
+        log.info("releaseLock success!");
+    }
+}

+ 1 - 1
src/main/java/org/springblade/modules/api/controller/AliPay01Controller.java

@@ -712,7 +712,7 @@ public class AliPay01Controller extends BladeController {
 				//获取寄售人信息
 				UserApp userApp = new UserApp();
 				UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,consign.getConsignUserId()));
-				//transfer(query, Double.toString(price), orderConsign.getId());
+				transfer(query, Double.toString(price), orderConsign.getId());
 			}else{
 				log.info(errMsg, "寄售来源为后台  == 无需打款" );
 				OrderConsign updateConsign = new OrderConsign();

+ 19 - 7
src/main/java/org/springblade/modules/finance/service/impl/OrderServiceImpl.java

@@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory;
 import org.springblade.common.cache.ParamCache;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.RedisTool;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.log.logger.BladeLogger;
 import org.springblade.core.redis.cache.BladeRedis;
@@ -110,6 +111,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 	@Resource
 	private BladeRedis bladeRedis;
 
+	@Autowired
+	RedisTool redisTool;
+
 	@Override
 	public IPage<OrderVO> selectOrderPage(IPage<OrderVO> page, OrderVO order) {
 		return page.setRecords(baseMapper.selectOrderPage(page, order));
@@ -250,15 +254,23 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		while (flag){
 			//判断用户寄售单是否为空
 			if(ObjectUtil.isNotNull(consign)){
-				//通过寄售id获取redis是否为空
-				Object o = bladeRedis.get(String.valueOf(consign.getId()));
-				if(ObjectUtil.isNull(o)){//判断redis中是否有其他人在使用
-					//将当前订单号放入redis中,防止其他用户抢到同一单号
-					bladeRedis.setEx(String.valueOf(consign.getId()), Integer.parseInt("1"), 30L);
-					flag = false;//跳出循环,使用当前单号来进行订单创建
-				}else{//如果存在则重新获取订单进行创建
+				//通过寄售id获取redis锁
+				boolean scheduleIssueTask = redisTool.getRedisLock(String.valueOf(consign.getId()), "1");
+				//判断时候获取到redis锁
+				if (!scheduleIssueTask) {
+					//未获取到重新获取
 					consign = consignMapper.randomConsign(request.getConsignConfigId(),request.getUserId());
+				}else{
+					flag = false;//跳出循环,使用当前单号来进行订单创建
 				}
+//				if(ObjectUtil.isNull(o)){//判断redis中是否有其他人在使用
+//					//将当前订单号放入redis中,防止其他用户抢到同一单号
+////					bladeRedis.setE
+//					bladeRedis.setEx(String.valueOf(consign.getId()), Integer.parseInt("1"), 30L);
+//					flag = false;//跳出循环,使用当前单号来进行订单创建
+//				}else{//如果存在则重新获取订单进行创建
+//					consign = consignMapper.randomConsign(request.getConsignConfigId(),request.getUserId());
+//				}
 			}else{//如果用户寄售单为空那么跳出当前循环重新获取平台单
 				flag = false;
 			}