Browse Source

修复缓存不能刷新的问题

tianyunperfect 3 years ago
parent
commit
18c4afc8c2

+ 6 - 0
book-dao/pom.xml

@@ -81,5 +81,11 @@
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-annotations</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>18.0</version>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 1
book-dao/src/main/java/com/book/dao/cps/pojo/User.java

@@ -9,7 +9,8 @@ import java.io.Serializable;
 
 /**
  * user
- * @author 
+ *
+ * @author
  */
 @Data
 public class User implements Serializable {

+ 15 - 7
book-server/src/main/java/com/book/server/aspect/CacheAOP.java

@@ -8,17 +8,14 @@ import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.Arrays;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
 import java.util.concurrent.TimeUnit;
 
-import static com.book.server.config.Const.CacheSplit;
-
 @Component
 @Aspect
 @Slf4j
@@ -57,10 +54,20 @@ public class CacheAOP {
                 // 默认,查询缓存,不存在则set
                 Object o = redisUtil.get(key);
                 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
-                Class returnClass = methodSignature.getReturnType();
+
+                Type type = methodSignature.getMethod().getGenericReturnType();
                 //3.校验redis中是否有数据,
                 if (o != null) {
-                    result = JsonUtils.getObject(o.toString(), returnClass);
+                    if (type instanceof ParameterizedType) {
+                        //如果是数组
+                        ParameterizedType pt = (ParameterizedType) type;
+                        Type modelType = pt.getActualTypeArguments()[0];
+                        result = JsonUtils.getList(o.toString(), Class.forName(modelType.getTypeName()));
+                    } else {
+                        //如果是普通对象
+                        result = JsonUtils.getObject(o.toString(), type.getClass());
+                    }
+
                 } else {
                     //没缓存,查询数据库
                     result = joinPoint.proceed();
@@ -78,6 +85,7 @@ public class CacheAOP {
 
     /**
      * 根据缓存时间,缓存数据
+     *
      * @param key
      * @param result
      * @param cacheFind

+ 2 - 1
book-server/src/main/java/com/book/server/controller/BookController.java

@@ -18,6 +18,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 
 /**
  * 书籍
@@ -85,7 +86,7 @@ public class BookController extends BaseController {
      */
     @GetMapping("/getBlockByPageId")
     //@Cacheable(value = "block", key = "#pageId")
-    public Result<List<BlockRes>> getBlockByPageId(Integer pageId) {
+    public Result<List<BlockRes>> getBlockByPageId(Integer pageId) throws ExecutionException {
         List<BlockRes> list = bookService.getBlockByPageId(pageId);
         return Result.byObject(list);
     }

+ 2 - 1
book-server/src/main/java/com/book/server/controller/GoodsController.java

@@ -27,6 +27,7 @@ public class GoodsController extends BaseController{
      */
     @GetMapping("/get")
     public Result<List<Goods>> getUnPayedGoods() {
-        return Result.success(goodsService.getUnPayedGoods());
+        List<Goods> unPayedGoods = goodsService.getUnPayedGoods();
+        return Result.success(unPayedGoods);
     }
 }

+ 39 - 0
book-server/src/main/java/com/book/server/service/BlockCacheGuava.java

@@ -0,0 +1,39 @@
+package com.book.server.service;
+
+import com.book.dao.VO.BlockRes;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class BlockCacheGuava {
+    private LoadingCache<Integer, List<BlockRes>> blockResCache;
+
+    @Autowired
+    private CacheService cacheService;
+
+    @PostConstruct
+    public void init() {
+        blockResCache = CacheBuilder.newBuilder()
+                .maximumSize(10) //设置缓存最大容量
+                .refreshAfterWrite(5, TimeUnit.MINUTES)
+                .build(new CacheLoader<Integer, List<BlockRes>>() {
+                    @Override
+                    public List<BlockRes> load(Integer key) throws Exception {
+                        return cacheService.getBlockByPageIdCache(key);
+                    }
+                });
+    }
+
+    public List<BlockRes> getBlockRes(Integer key) throws ExecutionException {
+        return blockResCache.get(key);
+    }
+}

+ 2 - 1
book-server/src/main/java/com/book/server/service/BookService.java

@@ -9,12 +9,13 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 
 public interface BookService {
     List<BookRes> query(QueryVO queryVO);
     List<BookRes> recommendByRead(QueryVO queryVO);
 
-    List<BlockRes> getBlockByPageId(Integer pageId);
+    List<BlockRes> getBlockByPageId(Integer pageId) throws ExecutionException;
 
     void insertBooks();
 

+ 1 - 2
book-server/src/main/java/com/book/server/service/CacheService.java

@@ -76,8 +76,7 @@ public class CacheService {
                 queryVO.getPage() * queryVO.getSize(), queryVO.getSize());
     }
 
-    @CacheFind(key = "block")
-    public ArrayList<BlockRes> setBlockByPageIdCache(Integer pageId) {
+    public ArrayList<BlockRes> getBlockByPageIdCache(Integer pageId) {
         //没有缓存
         ArrayList<BlockRes> list = new ArrayList<>();
         // 获取板块

+ 6 - 3
book-server/src/main/java/com/book/server/service/impl/BookServiceImpl.java

@@ -24,6 +24,7 @@ import com.book.dao.VO.*;
 import com.book.server.config.Const;
 import com.book.server.myevent.UserRecentReadEvent;
 import com.book.server.service.BookService;
+import com.book.server.service.BlockCacheGuava;
 import com.book.server.service.CacheService;
 import com.book.server.utils.HttpTool;
 import com.book.server.utils.RedisUtil;
@@ -45,6 +46,7 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.*;
+import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 
 @Service
@@ -102,11 +104,12 @@ public class BookServiceImpl implements BookService {
         return cacheService.getRecommendFromCache(queryVO.getSex(), queryVO.getPage(), queryVO.getSize());
     }
 
+    @Autowired
+    private BlockCacheGuava blockCacheGuava;
 
     @Override
-    public List<BlockRes> getBlockByPageId(Integer pageId) {
-        ArrayList<BlockRes> list = cacheService.setBlockByPageIdCache(pageId);
-        return list;
+    public List<BlockRes> getBlockByPageId(Integer pageId) throws ExecutionException {
+        return blockCacheGuava.getBlockRes(pageId);
     }
 
     @Override

+ 93 - 97
book-server/src/main/java/com/book/server/utils/JsonUtils.java

@@ -1,98 +1,94 @@
-package com.book.server.utils;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.reflect.TypeToken;
-
-import java.util.List;
-import java.util.Map;
-/**
- * json工具类
- * created in 2021/8/17
- * Project: book-store
- *
- * @author win7
- */
-
-
-
-
-
-
-public class JsonUtils {
-    private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
-
-    public JsonUtils() {
-    }
-
-    /**
-     * 转换为json字符串
-     *
-     * @param object 对象
-     * @return {@link String}
-     */
-    public static String toJsonStr(Object object) {
-        return gson.toJson(object);
-    }
-
-
-    /**
-     * 将json字符串 转换为 普通类
-     *
-     * @param jsonStr json str
-     * @param clazz   clazz
-     * @return {@link T}
-     */
-    public static <T> T getObject(String jsonStr, Class<T> clazz) {
-        return gson.fromJson(jsonStr, clazz);
-    }
-
-    /**
-     * 支持泛型等复杂类型
-     * new TypeToken<Result<List<Integer>>>(){}
-     * new TypeToken<List<Map<String, T>>>() {}
-     *
-     * @param jsonString json字符串
-     * @param typeToken  令牌类型
-     * @return {@link T}
-     */
-    public static <T> T getObject(String jsonString, TypeToken typeToken) {
-
-        return gson.fromJson(jsonString, typeToken.getType());
-    }
-
-    /**
-     * 转为数组
-     *
-     * @param jsonString
-     * @param tClass
-     * @param <T>
-     * @return
-     */
-    public static <T> T[] getArray(String jsonString, Class<T> tClass) {
-        return gson.fromJson(jsonString, TypeToken.getArray(tClass).getType());
-    }
-
-    /**
-     * 转为list
-     *
-     * @param jsonString
-     * @param tClass
-     * @param <T>
-     * @return
-     */
-    public static <T> List<T> getList(String jsonString, Class<T> tClass) {
-        return gson.fromJson(jsonString, new TypeToken<List<T>>() {
-        }.getType());
-    }
-
-    /**
-     * json字符串转成map的
-     *
-     * @param gsonString
-     * @return
-     */
-    public static <T> Map<String, T> getMap(String gsonString) {
-        return gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
-        }.getType());
-    }
+package com.book.server.utils;
+import com.google.gson.*;
+import com.google.gson.reflect.TypeToken;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+/**
+ * json工具类
+ * created in 2021/8/17
+ * Project: book-store
+ *
+ * @author win7
+ */
+
+
+
+
+
+
+public class JsonUtils {
+    private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
+
+    public JsonUtils() {
+    }
+
+    public static void main(String[] args) {
+
+    }
+
+    /**
+     * 转换为json字符串
+     *
+     * @param object 对象
+     * @return {@link String}
+     */
+    public static String toJsonStr(Object object) {
+        return gson.toJson(object);
+    }
+
+
+    /**
+     * 将json字符串 转换为 普通类
+     *
+     * @param jsonStr json str
+     * @param clazz   clazz
+     * @return {@link T}
+     */
+    public static <T> T getObject(String jsonStr, Class<T> clazz) {
+        return gson.fromJson(jsonStr, clazz);
+    }
+
+    /**
+     * 支持泛型等复杂类型
+     * new TypeToken<Result<List<Integer>>>(){}
+     * new TypeToken<List<Map<String, T>>>() {}
+     *
+     * @param jsonString json字符串
+     * @param typeToken  令牌类型
+     * @return {@link T}
+     */
+    public static <T> T getObject(String jsonString, TypeToken typeToken) {
+        return gson.fromJson(jsonString, typeToken.getType());
+    }
+
+    /**
+     * 将json字符串转换为ArrayList
+     *
+     * @param jsonArray
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> getList(String jsonArray, Class<T> clazz) {
+        List<T> list = new ArrayList<>();
+        JsonArray array = new JsonParser().parse(jsonArray).getAsJsonArray();
+        for (JsonElement obj : array) {
+            list.add(gson.fromJson(obj, clazz));
+        }
+        return list;
+    }
+
+    /**
+     * json字符串转成map的
+     *
+     * @param gsonString
+     * @return
+     */
+    public static <T> Map<String, T> getMap(String gsonString) {
+        return gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
+        }.getType());
+    }
 }