孙永军 1 rok pred
rodič
commit
09a1de6ebe

+ 2 - 0
src/main/java/com/smcic/api/operate/entity/KeysConst.java

@@ -12,4 +12,6 @@ public class KeysConst {
     public static final String KAFKA_LOCK = "OPERATE_KAFKA_LOCK";
 
     public static final String ENROLL_LIST = "OPERATE_ENROLL_LIST_";
+
+    public static final String OPERATE = "OPERATE_";
 }

+ 27 - 0
src/main/java/com/smcic/api/operate/job/TaskBootstrap.java

@@ -1,6 +1,12 @@
 package com.smcic.api.operate.job;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.smcic.api.operate.entity.KeysConst;
+import com.smcic.api.operate.service.impl.OperateServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
@@ -13,9 +19,30 @@ public class TaskBootstrap {
     @Resource
     private Kafka2Db kafka2Db;
 
+
+    @Resource
+    private OperateServiceImpl operateService;
+
+    @Resource
+    private RedisTemplate<String, String> redisTemplate;
+
+    @Resource
+    private ObjectMapper objectMapper;
+
     @PostConstruct
     public void init(){
         kafka2Db.run();
         log.info("Kafka2Db init-----------------------------------");
     }
+
+    @Scheduled(fixedRate = 1000 * 600)
+    public void operate2cache(){
+        operateService.list().forEach(operate -> {
+            try {
+                redisTemplate.opsForValue().set(KeysConst.OPERATE + operate.getOperateId(), objectMapper.writeValueAsString(operate));
+            } catch (JsonProcessingException e) {
+                log.error("活动写入缓存失败", e);
+            }
+        });
+    }
 }

+ 33 - 1
src/main/java/com/smcic/api/operate/service/impl/OperateServiceImpl.java

@@ -1,12 +1,19 @@
 package com.smcic.api.operate.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.smcic.api.operate.entity.KeysConst;
 import com.smcic.api.operate.entity.Operate;
 import com.smcic.api.operate.mapper.OperateMapper;
 import com.smcic.api.operate.service.IOperateService;
 import com.smcic.core.advice.APIException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.TextUtils;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 
@@ -19,11 +26,18 @@ import java.time.ZoneOffset;
  * @since 2022-12-10
  */
 @Service
+@Slf4j
 public class OperateServiceImpl extends ServiceImpl<OperateMapper, Operate> implements IOperateService {
 
+    @Resource
+    private RedisTemplate<String, String> redisTemplate;
+
+    @Resource
+    private ObjectMapper objectMapper;
+
     public void verify(Integer operateId){
         LocalDateTime now = LocalDateTime.now();
-        Operate ope = getById(operateId);
+        Operate ope = getFromCache(operateId);
 
         if(null != ope.getStartTime() && ope.getStartTime().isAfter(now)){
             throw new APIException(400, "活动尚未开始");
@@ -35,6 +49,24 @@ public class OperateServiceImpl extends ServiceImpl<OperateMapper, Operate> impl
 
     }
 
+    public Operate getFromCache(Integer operateId){
+        String ope = redisTemplate.opsForValue().get(KeysConst.OPERATE + operateId);
+        Operate operate = new Operate();
+        try {
+            if(TextUtils.isEmpty(ope)){
+                operate = getById(operateId);
+
+                redisTemplate.opsForValue().set(KeysConst.OPERATE + operateId, objectMapper.writeValueAsString(operate));
+
+            }else{
+                operate = objectMapper.readValue(ope, Operate.class);
+            }
+        } catch (JsonProcessingException e) {
+            log.error("获取operate失败", e);
+        }
+        return operate;
+    }
+
     public Long getTTl(Integer operateId){
         LocalDateTime now = LocalDateTime.now();
         Operate ope = getById(operateId);