Ver Fonte

任务提交 redis优先级队列 入库和取出脚本完成

秦国才 há 4 anos atrás
pai
commit
fab3b09f6e

+ 0 - 1
common/fire-common/src/main/java/com/fire/common/redis/RedisAmountScript.java

@@ -54,7 +54,6 @@ public class RedisAmountScript {
             runCode = jedisCluster.scriptLoad(SCRIPT, slotKey1);
             log.info("slotKey1:" + runCode);
             runCode = jedisCluster.scriptLoad(SCRIPT, slotKey2);
-            log.info("slotKey2:" + runCode);
         } else {
             log.info("脚本已加载");
         }

+ 76 - 0
common/fire-common/src/main/java/com/fire/common/redis/RedisPriorityQueueScript.java

@@ -0,0 +1,76 @@
+package com.fire.common.redis;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.stereotype.Component;
+import redis.clients.jedis.JedisCluster;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.Arrays;
+
+import static com.fire.dto.enums.RedisKey.PRIORITY_QUEUE;
+
+@Slf4j
+@Component
+public class RedisPriorityQueueScript {
+    @Resource
+    private JedisCluster jedisCluster;
+
+    private String runCode = "";
+
+    /*
+     *初始化
+     */
+    @PostConstruct
+    public void initScript() {
+        String slotKey = PRIORITY_QUEUE.key();
+        //LUA脚本
+        String SCRIPT = "local index = KEYS[1]"+
+                " local operating = ARGV[1]" +
+                " local score = ARGV[2]" +
+                " local content = ARGV[3]" +
+                " local res = 0" +
+                " if operating == 'get' then"+
+                " local ks=redis.call('ZRANGE', index, '0', '0')" +
+                " for _, item in ipairs(ks) do" +
+                " res = redis.call('ZREM', index, item)"+
+                " if res > 0 then" +
+                " return item" +
+                " end" +
+                " end" +
+                " elseif operating == 'add' then" +
+                " res = redis.call('ZADD', index, score, content)" +
+                " return res" +
+                " end" +
+                " return nil";
+        if (Strings.isBlank(runCode) || !jedisCluster.scriptExists(runCode, slotKey)) {
+            //redis支持脚本缓存,返回哈希码,后续可以继续用来调用脚本
+            runCode = jedisCluster.scriptLoad(SCRIPT, slotKey);
+        } else {
+            log.info("脚本已加载");
+        }
+    }
+    /*
+     * 获取优先级队列分发订单内容
+     * 返回 null:失败 获取数据:成功
+     */
+    public String getContent() {
+        String priorityQueue = PRIORITY_QUEUE.key();
+        Object res = jedisCluster.evalsha(runCode, Arrays.asList(priorityQueue), Arrays.asList("get","",""));
+        return res.toString();
+    }
+    /*
+     * 添加优先级队列分发订单内容
+     * 1.score 排序序号
+     * 2.content 分发记录类容
+     * 返回 0:覆盖 1:成功
+     */
+    public String addContent(Long score,String content) {
+        String priorityQueue = PRIORITY_QUEUE.key();
+        Object res = jedisCluster.evalsha(runCode, Arrays.asList(priorityQueue), Arrays.asList("add",String.valueOf(score),content));
+        return res.toString();
+    }
+
+
+}

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

@@ -7,7 +7,9 @@ public enum RedisKey {
     ORDER_INFO("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;
 

+ 15 - 2
modules/admin/src/main/java/com/fire/admin/rest/TestRest.java

@@ -3,6 +3,7 @@ package com.fire.admin.rest;
 
 import com.fire.common.redis.RedisAmountScript;
 import com.fire.common.redis.RedisOrderIdScript;
+import com.fire.common.redis.RedisPriorityQueueScript;
 import com.fire.es.DispatchDto;
 import com.fire.es.OrderEsDto;
 import lombok.extern.slf4j.Slf4j;
@@ -19,8 +20,9 @@ import javax.annotation.Resource;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.Arrays;
 import java.util.Date;
-
+import java.util.Set;
 
 
 @Slf4j
@@ -35,7 +37,7 @@ public class TestRest {
     private RedisAmountScript redisAmountScript;
 
     @Resource
-    private RedisOrderIdScript redisOrderIdScript;
+    private RedisPriorityQueueScript redisPriorityQueueScript;
 
     @Resource
     private JedisCluster jedisCluster;
@@ -144,6 +146,17 @@ public class TestRest {
     }
 
 
+    @GetMapping("/zrange")
+    public String zrange() {
+        redisPriorityQueueScript.addContent((long)12345,"test");
+        redisPriorityQueueScript.addContent((long)12346,"test1");
+        redisPriorityQueueScript.addContent((long)12341,"test3");
+        //LUA脚本
+        return redisPriorityQueueScript.getContent();
+    }
+
+
+
 
 }