Kaynağa Gözat

feat: 获取套餐详情接口优化

xdd 2 hafta önce
ebeveyn
işleme
9cbb6e0186

+ 8 - 0
fs-service-system/src/main/java/com/fs/store/cache/IFsStoreProductAttrValueCacheService.java

@@ -0,0 +1,8 @@
+package com.fs.store.cache;
+
+import com.fs.store.domain.FsStoreProductAttrValue;
+
+public interface IFsStoreProductAttrValueCacheService {
+    public FsStoreProductAttrValue selectFsStoreProductAttrValueById(Long id);
+
+}

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/cache/IFsStoreProductCacheService.java

@@ -1,6 +1,7 @@
 package com.fs.store.cache;
 
 import com.fs.store.domain.FsStoreProduct;
+import com.fs.store.domain.FsStoreProductPackage;
 
 public interface IFsStoreProductCacheService {
     /**
@@ -18,4 +19,5 @@ public interface IFsStoreProductCacheService {
      * @return 仓库编码
      */
     String getWarehouseCodeByProductId(Long productId);
+
 }

+ 7 - 0
fs-service-system/src/main/java/com/fs/store/cache/IFsStoreProductPackageCacheService.java

@@ -0,0 +1,7 @@
+package com.fs.store.cache;
+
+import com.fs.store.domain.FsStoreProductPackage;
+
+public interface IFsStoreProductPackageCacheService {
+    public FsStoreProductPackage selectFsStoreProductPackageById(Long packageId);
+}

+ 39 - 0
fs-service-system/src/main/java/com/fs/store/cache/impl/FsStoreProductAttrValueCacheServiceImpl.java

@@ -0,0 +1,39 @@
+package com.fs.store.cache.impl;
+
+import com.fs.store.cache.IFsStoreProductAttrValueCacheService;
+import com.fs.store.domain.FsStoreProductAttrValue;
+import com.fs.store.domain.FsStoreProductPackage;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class FsStoreProductAttrValueCacheServiceImpl implements IFsStoreProductAttrValueCacheService {
+    private final RedisTemplate<String,Object> redisTemplate;
+    private final IFsStoreProductAttrValueCacheService productAttrValueCacheService;
+    @Override
+    public FsStoreProductAttrValue selectFsStoreProductAttrValueById(Long id) {
+        if(id == null) {
+            throw new IllegalArgumentException("商品属性id不能为空!");
+        }
+        // 尝试从缓存获取
+        try {
+            String redisKey = String.format("fs:store:product:attr:value:%d", id);
+            FsStoreProductAttrValue productPackage = (FsStoreProductAttrValue) redisTemplate.opsForValue().get(redisKey);
+            if(productPackage != null) {
+                log.debug("缓存命中商品属性信息, id: {}", id);
+                return productPackage;
+            }
+        } catch (Exception e) {
+            log.error("获取商品属性缓存异常, id: {}, 异常信息: {}", id, e.getMessage(), e);
+        }
+
+        log.debug("缓存未命中商品属性信息, id: {}, 从数据库查询", id);
+        FsStoreProductAttrValue productPackage = productAttrValueCacheService.selectFsStoreProductAttrValueById(id);
+
+        return productPackage;
+    }
+}

+ 22 - 10
fs-service-system/src/main/java/com/fs/store/cache/impl/IFsStoreProductCacheServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.fs.store.cache.IFsStoreProductCacheService;
 import com.fs.store.cache.IFsWarehouseCacheService;
 import com.fs.store.domain.FsStoreProduct;
+import com.fs.store.domain.FsStoreProductPackage;
 import com.fs.store.domain.FsWarehouses;
 import com.fs.store.service.IFsStoreProductService;
 import com.fs.system.cache.impl.SysDictDataCacheServiceImpl;
@@ -11,6 +12,7 @@ import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.util.concurrent.TimeUnit;
@@ -21,26 +23,36 @@ import java.util.concurrent.TimeUnit;
 public class IFsStoreProductCacheServiceImpl implements IFsStoreProductCacheService {
     private final IFsStoreProductService fsStoreProductService;
     private final IFsWarehouseCacheService fsWarehouseCacheService;
-    /**
-     * 使用Caffeine本地缓存
-     * maximumSize: 最大缓存条数
-     * expireAfterWrite: 写入后多久过期(分钟)
-     */
-    private static final Cache<Long, FsStoreProduct> CACHE = Caffeine.newBuilder()
-            .maximumSize(1000)
-            .expireAfterWrite(10, TimeUnit.SECONDS)
-            .build();
 
     private static final Cache<Long, String> WAREHOUSE_CACHE = Caffeine.newBuilder()
             .maximumSize(1000)
             .expireAfterWrite(10, TimeUnit.SECONDS)
             .build();
 
+    private final RedisTemplate<String,Object> redisTemplate;
+
     @Override
     public FsStoreProduct selectFsStoreProductById(Long productId) {
         log.info("开始查询商品信息,商品ID:{}", productId);
+        if(productId == null) {
+            throw new IllegalArgumentException("产品id不能为空!");
+        }
+        // 尝试从缓存获取
+        try {
+            String redisKey = String.format("fs:store:product:%d", productId);
+            FsStoreProduct product = (FsStoreProduct) redisTemplate.opsForValue().get(redisKey);
+            if(product != null) {
+                log.debug("缓存命中产品信息, productId: {}", productId);
+                return product;
+            }
+        } catch (Exception e) {
+            log.error("获取产品缓存异常, productId: {}, 异常信息: {}", productId, e.getMessage(), e);
+        }
+
+        log.debug("缓存未命中产品信息, productId: {}, 从数据库查询", productId);
+        FsStoreProduct fsStoreProduct = fsStoreProductService.selectFsStoreProductById(productId);
 
-        return CACHE.get(productId, e -> fsStoreProductService.selectFsStoreProductById(productId));
+        return fsStoreProduct;
     }
 
     @Override

+ 40 - 0
fs-service-system/src/main/java/com/fs/store/cache/impl/IFsStoreProductPackageServiceImpl.java

@@ -0,0 +1,40 @@
+package com.fs.store.cache.impl;
+
+import com.fs.store.cache.IFsStoreProductPackageCacheService;
+import com.fs.store.domain.FsStoreProductPackage;
+import com.fs.store.mapper.FsStoreProductPackageMapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class IFsStoreProductPackageServiceImpl implements IFsStoreProductPackageCacheService {
+    private final RedisTemplate<String,Object> redisTemplate;
+    private final FsStoreProductPackageMapper fsStoreProductPackageMapper;
+
+    @Override
+    public FsStoreProductPackage selectFsStoreProductPackageById(Long packageId) {
+        if(packageId == null) {
+            throw new IllegalArgumentException("套餐包id不能为空!");
+        }
+        // 尝试从缓存获取
+        try {
+            String redisKey = String.format("fs:store:product:package:%d", packageId);
+            FsStoreProductPackage productPackage = (FsStoreProductPackage) redisTemplate.opsForValue().get(redisKey);
+            if(productPackage != null) {
+                log.debug("缓存命中套餐包信息, packageId: {}", packageId);
+                return productPackage;
+            }
+        } catch (Exception e) {
+            log.error("获取套餐包缓存异常, packageId: {}, 异常信息: {}", packageId, e.getMessage(), e);
+        }
+
+        log.debug("缓存未命中套餐包信息, packageId: {}, 从数据库查询", packageId);
+        FsStoreProductPackage productPackage = fsStoreProductPackageMapper.selectFsStoreProductPackageById(packageId);
+
+        return productPackage;
+    }
+}

+ 13 - 5
fs-user-app/src/main/java/com/fs/app/controller/StoreProductPackageController.java

@@ -5,6 +5,9 @@ import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
 import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
+import com.fs.store.cache.IFsStoreProductAttrValueCacheService;
+import com.fs.store.cache.IFsStoreProductCacheService;
+import com.fs.store.cache.IFsStoreProductPackageCacheService;
 import com.fs.store.domain.FsStoreProduct;
 import com.fs.store.domain.FsStoreProductAttrValue;
 import com.fs.store.domain.FsStoreProductPackage;
@@ -35,9 +38,12 @@ public class StoreProductPackageController extends  AppBaseController {
     @Autowired
     private IFsStoreProductPackageService productPackageService;
     @Autowired
-    private IFsStoreProductAttrValueService attrValueService;
+    private IFsStoreProductCacheService fsStoreProductCacheService;
     @Autowired
-    private IFsStoreProductService storeProductService;
+    private IFsStoreProductPackageCacheService fsStoreProductPackageCacheService;
+    @Autowired
+    private IFsStoreProductAttrValueCacheService fsStoreProductAttrValueCacheService;
+
     @Login
     @ApiOperation("获取套餐列表")
     @GetMapping("/getStoreProductPackage")
@@ -48,18 +54,20 @@ public class StoreProductPackageController extends  AppBaseController {
         PageInfo<FsStoreProductPacketVO> listPageInfo=new PageInfo<>(list);
         return R.ok().put("data",listPageInfo);
     }
+
+
     @ApiOperation("获取套餐详情")
     @GetMapping("/getStoreProductPackageDetails")
     public R getStoreProductPackageDetails(@RequestParam("packageId") Long packageId){
-        FsStoreProductPackage storeProductPackage=productPackageService.selectFsStoreProductPackageById(packageId);
+        FsStoreProductPackage storeProductPackage=fsStoreProductPackageCacheService.selectFsStoreProductPackageById(packageId);
         List<StoreOrderProductDTO> productList=new ArrayList<>();
         JSONArray jsonArray= JSONUtil.parseArray(storeProductPackage.getProducts());
         List<StorePackageProductDTO> goodsList=JSONUtil.toList(jsonArray, StorePackageProductDTO.class);
         for(StorePackageProductDTO dto:goodsList){
             StoreOrderProductDTO productDTO=new StoreOrderProductDTO();
-            FsStoreProductAttrValue attrValue=attrValueService.selectFsStoreProductAttrValueById(dto.getId());
+            FsStoreProductAttrValue attrValue=fsStoreProductAttrValueCacheService.selectFsStoreProductAttrValueById(dto.getId());
             if(attrValue!=null){
-                FsStoreProduct product=storeProductService.selectFsStoreProductById(attrValue.getProductId());
+                FsStoreProduct product=fsStoreProductCacheService.selectFsStoreProductById(attrValue.getProductId());
                 if(product!=null){
                     productDTO.setProductId(attrValue.getProductId());
                     productDTO.setId(dto.getId());