Browse Source

fix 试题缓存清理bug 追加清理试题相关的paper缓存

xiatian 5 years ago
parent
commit
173a40f2e5

+ 34 - 27
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/QuesController.java

@@ -1,26 +1,32 @@
 package cn.com.qmth.examcloud.core.questions.api;
 
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.google.gson.Gson;
+
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.core.questions.dao.QuesRepo;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionSearchCondition;
+import cn.com.qmth.examcloud.core.questions.service.PaperDetailUnitService;
 import cn.com.qmth.examcloud.core.questions.service.QuesService;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
-import com.google.gson.Gson;
 import io.swagger.annotations.ApiOperation;
-import org.apache.commons.collections.CollectionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static cn.com.qmth.examcloud.core.questions.service.cache.Constants.CACHE_KEY_QUESTION;
 
 /**
  * Created by songyue on 16/12/28.
@@ -28,8 +34,6 @@ import static cn.com.qmth.examcloud.core.questions.service.cache.Constants.CACHE
 @RestController
 @RequestMapping("${api_cqb}/")
 public class QuesController extends ControllerSupport {
-    @Autowired
-    private RedisTemplate<String, Object> redisTemplate;
 
     @Autowired
     QuesService quesService;
@@ -39,6 +43,9 @@ public class QuesController extends ControllerSupport {
 
     @Autowired
     Gson gson;
+    
+    @Autowired
+    PaperDetailUnitService paperDetailUnitService;
 
     /**
      * 获取试题
@@ -81,7 +88,7 @@ public class QuesController extends ControllerSupport {
         quesService.saveQues(question);
 
         //清除缓存
-        this.clearQuestionCache(question.getId());
+        paperDetailUnitService.clearQuestionCache(question.getId());
 
         return new ResponseEntity<>(HttpStatus.OK);
     }
@@ -110,7 +117,7 @@ public class QuesController extends ControllerSupport {
         quesRepo.deleteById(id);
 
         //清除缓存
-        this.clearQuestionCache(id);
+        paperDetailUnitService.clearQuestionCache(id);
 
         return new ResponseEntity<>(HttpStatus.OK);
     }
@@ -130,7 +137,7 @@ public class QuesController extends ControllerSupport {
         quesRepo.save(question);
 
         //清除缓存
-        this.clearQuestionCache(id);
+        paperDetailUnitService.clearQuestionCache(id);
 
         return new ResponseEntity<>(question, HttpStatus.OK);
     }
@@ -165,13 +172,13 @@ public class QuesController extends ControllerSupport {
         return new ResponseEntity<>(HttpStatus.OK);
     }
 
-    private void clearQuestionCache(String questionId) {
-        //清理与当前试题相关的缓存
-        final String patternKey = CACHE_KEY_QUESTION + "*" + questionId;
-        Set<String> keys = redisTemplate.keys(patternKey);
-        if (CollectionUtils.isNotEmpty(keys)) {
-            redisTemplate.delete(keys);
-        }
-    }
+//    private void clearQuestionCache(String questionId) {
+//        //清理与当前试题相关的缓存
+//        final String patternKey = CACHE_KEY_QUESTION + "*" + questionId;
+//        Set<String> keys = redisTemplate.keys(patternKey);
+//        if (CollectionUtils.isNotEmpty(keys)) {
+//            redisTemplate.delete(keys);
+//        }
+//    }
 
 }

+ 2 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/PaperDetailUnitService.java

@@ -97,4 +97,6 @@ public interface PaperDetailUnitService {
     //public List<PaperDetailUnit> testFind(List<String> ids,PaperType paperType,List<Question> questionList);
 
     public List<PaperDetailUnit> findByPaperIds(List<String> ids);
+
+    public void clearQuestionCache(String questionId);
 }

+ 40 - 22
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperDetailUnitServiceImpl.java

@@ -1,5 +1,25 @@
 package cn.com.qmth.examcloud.core.questions.service.impl;
 
+import static cn.com.qmth.examcloud.core.questions.service.cache.Constants.CACHE_KEY_PAPER;
+import static cn.com.qmth.examcloud.core.questions.service.cache.Constants.CACHE_KEY_QUESTION;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.domain.Sort.Order;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.core.questions.base.Model;
 import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
@@ -13,26 +33,6 @@ import cn.com.qmth.examcloud.core.questions.service.PaperDetailUnitService;
 import cn.com.qmth.examcloud.core.questions.service.PaperService;
 import cn.com.qmth.examcloud.core.questions.service.QuesService;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
-import org.apache.commons.collections.CollectionUtils;
-import org.bson.types.ObjectId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.domain.Sort.Order;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import static cn.com.qmth.examcloud.core.questions.service.cache.Constants.CACHE_KEY_QUESTION;
 
 /**
  * @author chenken
@@ -41,7 +41,6 @@ import static cn.com.qmth.examcloud.core.questions.service.cache.Constants.CACHE
  */
 @Service("paperDetailUnitService")
 public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
-    private static final Logger log = LoggerFactory.getLogger(PaperDetailUnitServiceImpl.class);
 
     @Autowired
     PaperDetailUnitRepo paperDetailUnitRepo;
@@ -338,13 +337,32 @@ public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
         return paperDetailUnits;
     }
 
-    private void clearQuestionCache(String questionId) {
+    @Override
+    public void clearQuestionCache(String questionId) {
         //清理与当前试题相关的缓存
         final String patternKey = CACHE_KEY_QUESTION + "*" + questionId;
         Set<String> keys = redisTemplate.keys(patternKey);
         if (CollectionUtils.isNotEmpty(keys)) {
             redisTemplate.delete(keys);
         }
+        //根据questionId清空相关联的paper缓存
+        List<PaperDetailUnit> list=findByQuestionId(questionId);
+        if(list!=null&&list.size()>0) {
+        	for(PaperDetailUnit pd:list) {
+        		String paperKey = CACHE_KEY_PAPER + "*" + pd.getPaper().getId();
+                Set<String> paperKeys = redisTemplate.keys(paperKey);
+                if (CollectionUtils.isNotEmpty(paperKeys)) {
+                    redisTemplate.delete(paperKeys);
+                }
+        	}
+        }
+    }
+    
+    private List<PaperDetailUnit> findByQuestionId(String questionId) {
+        Query query = new Query();
+        query.addCriteria(Criteria.where("question.id").is(questionId));
+        List<PaperDetailUnit> paperDetailUnits = this.mongoTemplate.find(query, PaperDetailUnit.class);
+        return paperDetailUnits;
     }
 
 }