Ver Fonte

bug修改 完成订单号校验大key拆分

张均强 há 4 anos atrás
pai
commit
323e60117a

+ 33 - 14
common/fire-common/src/main/java/com/fire/common/redis/RedisOrderIdScript.java

@@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.stereotype.Component;
 import redis.clients.jedis.JedisCluster;
+import redis.clients.jedis.exceptions.JedisNoScriptException;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
@@ -15,6 +16,19 @@ import static com.fire.dto.enums.RedisKey.ORDER_DOWN;
 @Slf4j
 @Component
 public class RedisOrderIdScript {
+
+    //LUA脚本
+    private final static String SCRIPT = "local key = KEYS[1]" +
+            " local customerOrder = KEYS[2]" +
+            " local orderId = ARGV[1]" +
+            " local res = redis.pcall('HEXISTS', key, customerOrder)" +
+            " if res == 1 then" +
+            " return 0" +
+            " else" +
+            " redis.pcall('HSET', key, customerOrder, orderId)" +
+            " return 1" +
+            " end";
+
     @Resource
     private JedisCluster jedisCluster;
 
@@ -25,24 +39,17 @@ public class RedisOrderIdScript {
      */
     @PostConstruct
     public void initScript() {
-        String slotKey = ORDER_DOWN.key();
-        //LUA脚本
-        String SCRIPT = "local key = KEYS[1]" +
-                " local customerOrder = KEYS[2]" +
-                " local orderId = ARGV[1]" +
-                " local res = redis.pcall('HEXISTS', key, customerOrder)" +
-                " if res == 1 then" +
-                " return 0" +
-                " else" +
-                " redis.pcall('HSET', key, customerOrder, orderId)" +
-                " return 1" +
-                " end";
+        String slotKey = "{" + ORDER_DOWN.key() + ".0}";
+
         if (Strings.isBlank(runCode) || !jedisCluster.scriptExists(runCode, slotKey)) {
+            log.info("脚本加载:" + slotKey);
             //redis支持脚本缓存,返回哈希码,后续可以继续用来调用脚本
             runCode = jedisCluster.scriptLoad(SCRIPT, slotKey);
         } else {
             log.info("脚本已加载");
         }
+
+
     }
 
     /*
@@ -53,8 +60,20 @@ public class RedisOrderIdScript {
      * 返回 1 成功加入 0 下单号重复
      */
     public String checkOrderId(String customerOrder, String OrderId) {
-        String orderName = ORDER_DOWN.key();
-        Object res = jedisCluster.evalsha(runCode, Arrays.asList(orderName, orderName + customerOrder), Collections.singletonList(OrderId));
+        //计算key的hash
+        int value = customerOrder.hashCode() % 10000;
+        if (value < 0) {
+            value = Math.abs(value);
+        }
+        String orderName = "{" + ORDER_DOWN.key() + "." + value + "}";
+        Object res;
+        try {
+            res = jedisCluster.evalsha(runCode, Arrays.asList(orderName, orderName + customerOrder), Collections.singletonList(OrderId));
+        } catch (JedisNoScriptException e) {
+            jedisCluster.scriptLoad(SCRIPT, orderName);
+            res = jedisCluster.evalsha(runCode, Arrays.asList(orderName, orderName + customerOrder), Collections.singletonList(OrderId));
+        }
         return res.toString();
     }
+
 }

+ 1 - 1
common/fire-dto/src/main/java/com/fire/dto/enums/RedisKey.java

@@ -9,7 +9,7 @@ public enum RedisKey {
     CHILD_ORDER_INFO("child.order.info.", "子订单详情"),
     CUSTOMER_AMOUNT("{customer.amount}", "客户金额"),
     SUPPLIER_AMOUNT("{supplier.amount}", "供应商金额"),
-    ORDER_DOWN("{down.order}", "客户下单号 非订单号"),
+    ORDER_DOWN("down.order", "客户下单号 非订单号"),
     PRIORITY_QUEUE("{priority.queue}", "分发订单优先级队列");
 
     private final String key;

+ 5 - 1
modules/distribution/src/main/java/com/fire/dist/service/impl/OrderUpdateServiceImpl.java

@@ -7,7 +7,9 @@ import com.fire.dist.service.OrderUpdateService;
 import com.fire.dto.FlowOrderInfo;
 import com.fire.dto.MobileFlowDispatchRec;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.client.exception.MQBrokerException;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.messaging.MessagingException;
 import org.springframework.messaging.support.MessageBuilder;
 import org.springframework.stereotype.Service;
 import redis.clients.jedis.JedisCluster;
@@ -51,10 +53,12 @@ public class OrderUpdateServiceImpl implements OrderUpdateService {
             jedisCluster.hset(ORDER_INFO.key() + hKey, String.valueOf(orderId), orderStr);
             //订单入队列
             rocketMQTemplate.syncSendOrderly(ORDER_TOPIC + ":" + tag, MessageBuilder.withPayload(orderStr).build(), String.valueOf(orderId));
-
         } catch (JsonProcessingException e) {
             //订单转换的其他异常 如果执行到这里说明系统有bug
             log.error("订单在分发的时候转换成json失败:", e);
+        } catch (MessagingException e1) {
+
+            log.error("订单在分发的时候发送失败:", e1);
         }
     }
 

+ 3 - 3
modules/make-order/src/main/resources/bootstrap.yml

@@ -4,7 +4,7 @@ spring:
   application:
     name: make-order
   profiles:
-    active: dev
+    active: test
 ---
 spring:
   config:
@@ -28,11 +28,11 @@ spring:
   cloud:
     nacos:
       config:
-        server-addr: 47.106.133.48:8848
+        server-addr: 139.155.226.217:8848
         file-extension: yaml
         namespace: fire
       discovery:
-        server-addr: 47.106.133.48:8848
+        server-addr: 139.155.226.217:8848
         namespace: fire
         service: make-order