diff --git a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/AtomicSequenceCache.java b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/AtomicSequenceCache.java new file mode 100644 index 0000000..6215b75 --- /dev/null +++ b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/AtomicSequenceCache.java @@ -0,0 +1,37 @@ +package com.muyu.common.cache; + +import com.muyu.common.cache.decoration.DecorationKey; + +/** + * @author DongZl + * @description: 原子序列缓存基准 + * @Date 2024-4-1 下午 08:07 + */ +public interface AtomicSequenceCache extends DecorationKey { + + /** + * 获取存储的值 + * @param key 键 + * @return 值 + */ + public Long get(K key); + + /** + * 自增 + */ + public Long increment(K key); + /** + * 自减 + */ + public Long decrement(K key); + + /** + * 增加数值 + */ + public Long increment(K key, Long number); + + /** + * 减少数值 + */ + public Long decrement(K key, Long number); +} diff --git a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/Cache.java b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/Cache.java index cea237f..9d96206 100644 --- a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/Cache.java +++ b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/Cache.java @@ -1,27 +1,13 @@ package com.muyu.common.cache; -public interface Cache { +import com.muyu.common.cache.decoration.DecorationKey; - /** - * key前缀 - * @return key前缀 - */ - public String keyPre(); - - - /** - * 编码 - * @param key ID - * @return 键 - */ - public String encode(K key); - - /** - * 解码 - * @param redisKey 数据库键 - * @return ID - */ - public K decode(String redisKey); +/** + * @author DongZl + * @description: 缓存接口基类 + * @Date 2024-3-26 下午 03:25 + */ +public interface Cache extends DecorationKey { /** * 通过Key获取value值 diff --git a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/HashCache.java b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/HashCache.java new file mode 100644 index 0000000..dff5fec --- /dev/null +++ b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/HashCache.java @@ -0,0 +1,97 @@ +package com.muyu.common.cache; + +import com.muyu.common.cache.decoration.DecorationKey; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * @author DongZl + * @description: Hash缓存基准 + * @Date 2024-3-29 下午 03:16 + */ +public interface HashCache extends DecorationKey { + + + /** + * 编码 + * @param hashKey ID + * @return 键 + */ + public String encodeHashKey(HK hashKey); + + /** + * 解码 + * @param redisHashKey 数据库键 + * @return ID + */ + public HK decodeHashKey(String redisHashKey); + + /** + * 通过Key获取所有的map + * @param key 数据库键 + * @return 所有集合Map + */ + public Map get(K key); + + /** + * 通过键和hashKey获取数据库hashValue + * @param key 键 + * @param hashKey hash键 + * @return hash值 + */ + public HV get(K key, HK hashKey); + + /** + * 通过键和hashKey获取数据库hashValue + * @param key 键 + * @param hashKeyList hash键集合 + * @return hash值 + */ + public List get(K key, HK... hashKeyList); + + /** + * 获取hash值集合 + * @param key 键 + * @return hash值集合 + */ + public List getToList(K key); + + /** + * 存储数据 + * @param key redis键 + * @param map hashMap集合 + */ + public void put(K key, Map map); + + /** + * 存储数据 + * @param key redis键 + * @param dataList 数据值 + * @param hashKey hash键 + */ + public void put(K key, List dataList, Function hashKey); + + /** + * 存储数据 + * @param key redis键 + * @param hashKey hash键 + * @param hashValue hash值 + */ + public void put(K key, HK hashKey, HV hashValue); + + /** + * 通过redis键删除 + * @param key hash键 + */ + public void remove(K key); + + /** + * 通过redis键和hash键删除 + * @param key redis键 + * @param hashKey hash键 + */ + public void remove(K key, HK hashKey); + +} diff --git a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/AtomicSequenceCacheAbs.java b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/AtomicSequenceCacheAbs.java new file mode 100644 index 0000000..d8ea20f --- /dev/null +++ b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/AtomicSequenceCacheAbs.java @@ -0,0 +1,93 @@ +package com.muyu.common.cache.abs; + +import com.muyu.common.cache.AtomicSequenceCache; +import com.muyu.common.redis.service.RedisService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author DongZl + * @description: 原子序列缓存抽象类 + * @Date 2024-4-1 下午 08:33 + */ +public abstract class AtomicSequenceCacheAbs implements AtomicSequenceCache { + + @Autowired + private RedisService redisService; + + /** + * 获取存储的值 + * @param key 键 + * @return 值 + */ + @Override + public Long get (K key) { + return this.redisService.getCacheObject(encode(key)); + } + + /** + * 自增 + * @param key + */ + @Override + public Long increment (K key) { + return this.increment(key, 1L); + } + + /** + * 自减 + * + * @param key + */ + @Override + public Long decrement (K key) { + return this.decrement(key, 1L); + } + + /** + * 增加数值 + * + * @param key + * @param number + */ + @Override + public Long increment (K key, Long number) { + Long numberValue = redisService.getCacheObject(encode(key)); + if (numberValue == null){ + Long data = getData(key); + data = data == null ? 0L : data; + redisService.setCacheObject(encode(key), data); + } + return redisService.increment(encode(key), number); + } + + /** + * 减少数值 + * + * @param key + * @param number + */ + @Override + public Long decrement (K key, Long number) { + Long numberValue = redisService.getCacheObject(encode(key)); + if (numberValue == null){ + Long data = getData(key); + data = data == null ? 0L : data; + redisService.setCacheObject(encode(key), data); + } + return redisService.decrement(encode(key), number); + } + + /** + * 编码 + * + * @param key ID + * + * @return 键 + */ + @Override + public String encode (K key) { + return keyPre() + key; + } + + public abstract Long getData(K key); +} diff --git a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/CacheAbs.java b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/CacheAbs.java index 25390ad..d2bf765 100644 --- a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/CacheAbs.java +++ b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/CacheAbs.java @@ -6,6 +6,11 @@ import org.springframework.beans.factory.annotation.Autowired; import java.util.concurrent.TimeUnit; +/** + * @author DongZl + * @description: 缓存抽象类 + * @Date 2024-3-27 下午 03:10 + */ public abstract class CacheAbs implements Cache { @Autowired diff --git a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/HashCacheAbs.java b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/HashCacheAbs.java new file mode 100644 index 0000000..a4195d6 --- /dev/null +++ b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/abs/HashCacheAbs.java @@ -0,0 +1,212 @@ +package com.muyu.common.cache.abs; + +import com.muyu.common.cache.HashCache; +import com.muyu.common.redis.service.RedisService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * @author DongZl + * @description: hash缓存抽象类 + * @Date 2024-3-29 下午 07:40 + */ +public abstract class HashCacheAbs implements HashCache { + + @Autowired + private RedisService redisService; + + /** + * 编码 + * + * @param key ID + * + * @return 键 + */ + @Override + public String encode (K key) { + return keyPre() + key; + } + + /** + * 编码 + * @param hashKey ID + * @return 键 + */ + @Override + public String encodeHashKey (HK hashKey) { + return hashKey.toString(); + } + + /** + * 通过Key获取所有的map + * @param key 数据库键 + * @return 所有集合Map + */ + @Override + public Map get (K key) { + // 获取为null的情况 + Map cacheMap = redisService.getCacheMap(encode(key)); + if (cacheMap == null || cacheMap.isEmpty()){ + Map dataMap = getData(key); + if (dataMap != null && !dataMap.isEmpty()){ + cacheMap = encodeMap(dataMap); + }else { + cacheMap = encodeMap(defaultValue()); + } + redisService.setCacheMap(encode(key), cacheMap); + } + return decodeMap(cacheMap); + } + + /** + * 通过键和hashKey获取数据库hashValue + * + * @param key 键 + * @param hashKey hash键 + * + * @return hash值 + */ + @Override + public HV get (K key, HK hashKey) { + HV hashValue = redisService.getCacheMapValue(encode(key), encodeHashKey(hashKey)); + if (hashValue == null){ + HV dataValue = getData(key, hashKey); + hashValue = dataValue != null ? dataValue : defaultHashValue(); + put(key, hashKey, hashValue); + } + return hashValue; + } + + /** + * 通过键和hashKey获取数据库hashValue + * + * @param key 键 + * @param hashKeyList hash键集合 + * + * @return hash值 + */ + @Override + public List get (K key, HK... hashKeyList) { + List encodeHashKeyList = Arrays.stream(hashKeyList).map(this::encodeHashKey).toList(); + return redisService.getMultiCacheMapValue(encode(key), encodeHashKeyList); + } + + /** + * 获取hash值集合 + * + * @param key 键 + * + * @return hash值集合 + */ + @Override + public List getToList (K key) { + Map hkhvMap = get(key); + return hkhvMap.values().stream().toList(); + } + + /** + * 存储数据 + * + * @param key redis键 + * @param map hashMap集合 + */ + @Override + public void put (K key, Map map) { + redisService.setCacheMap(encode(key), encodeMap(map)); + } + + /** + * 存储数据 + * + * @param key redis键 + * @param dataList 数据值 + * @param hashKey hash键 + */ + @Override + public void put (K key, List dataList, Function hashKey) { + Map dataMap = new HashMap<>(); + dataList.forEach((data) -> dataMap.put(hashKey.apply(data), data)); + redisService.setCacheMap(encode(key), encodeMap(dataMap)); + } + + /** + * 存储数据 + * + * @param key redis键 + * @param hashKey hash键 + * @param hashValue hash值 + */ + @Override + public void put (K key, HK hashKey, HV hashValue) { + redisService.setCacheMapValue(encode(key), encodeHashKey(hashKey), hashValue); + } + + /** + * 通过redis键删除 + * + * @param key hash键 + */ + @Override + public void remove (K key) { + redisService.deleteObject(encode(key)); + } + + /** + * 通过redis键和hash键删除 + * + * @param key redis键 + * @param hashKey hash键 + */ + @Override + public void remove (K key, HK hashKey) { + redisService.deleteCacheMapValue(encode(key), encodeHashKey(hashKey)); + } + + /** + * 原始数据转编码数据 + * @param dataMap 原始数据 + * @return 编码数据 + */ + private Map encodeMap(Map dataMap){ + Map encodeDataMap = new HashMap<>(); + dataMap.forEach((hashKey, HashValue) -> encodeDataMap.put(encodeHashKey(hashKey), HashValue)); + return encodeDataMap; + } + + /** + * 编码数据转原始数据 + * @param encodeDataMap 编码数据 + * @return 原始数据 + */ + private Map decodeMap(Map encodeDataMap){ + Map dataMap = new HashMap<>(); + encodeDataMap.forEach((hashKey, hashValue) -> dataMap.put(decodeHashKey(hashKey), hashValue)); + return dataMap; + } + + /** + * 通过键获取所有的hash数据 + * @param key 键 + * @return + */ + public abstract Map getData(K key); + + /** + * 通过缓存键和hash键获取hash值 + * @param key 缓存键 + * @param hashKey hash键 + * @return hash值 + */ + public abstract HV getData(K key, HK hashKey); + + /** + * 默认值 + */ + public abstract Map defaultValue(); + public abstract HV defaultHashValue(); +} diff --git a/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/decoration/DecorationKey.java b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/decoration/DecorationKey.java new file mode 100644 index 0000000..284b09a --- /dev/null +++ b/muyu-common/muyu-common-cache/src/main/java/com/muyu/common/cache/decoration/DecorationKey.java @@ -0,0 +1,30 @@ +package com.muyu.common.cache.decoration; + +/** + * @author DongZl + * @description: 装饰Key + * @Date 2024-3-29 下午 03:19 + */ +public interface DecorationKey { + + /** + * key前缀 + * @return key前缀 + */ + public String keyPre(); + + + /** + * 编码 + * @param key ID + * @return 键 + */ + public String encode(K key); + + /** + * 解码 + * @param redisKey 数据库键 + * @return ID + */ + public K decode(String redisKey); +} diff --git a/muyu-common/muyu-common-redis/src/main/java/com/muyu/common/redis/service/RedisService.java b/muyu-common/muyu-common-redis/src/main/java/com/muyu/common/redis/service/RedisService.java index db90c1e..beeefbb 100644 --- a/muyu-common/muyu-common-redis/src/main/java/com/muyu/common/redis/service/RedisService.java +++ b/muyu-common/muyu-common-redis/src/main/java/com/muyu/common/redis/service/RedisService.java @@ -229,7 +229,7 @@ public class RedisService { * * @return Hash对象集合 */ - public List getMultiCacheMapValue (final String key, final Collection hKeys) { + public List getMultiCacheMapValue (final String key, final Collection hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); } @@ -255,4 +255,23 @@ public class RedisService { public Collection keys (final String pattern) { return redisTemplate.keys(pattern); } + + /** + * 减少序列值 + * @param key key + * @param number 值 + * @return 操作后的值 + */ + public Long decrement (final String key, Long number) { + return redisTemplate.opsForValue().decrement(key,number); + } + /** + * 增加序列值 + * @param key key + * @param number 值 + * @return 操作后的值 + */ + public Long increment (final String key, Long number) { + return redisTemplate.opsForValue().increment(key,number); + } } diff --git a/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectInfoCache.java b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectInfoCache.java index 8f8ffc1..0876a21 100644 --- a/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectInfoCache.java +++ b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectInfoCache.java @@ -1,36 +1,40 @@ package com.muyu.product.cache; +import com.muyu.common.cache.HashCache; import com.muyu.common.cache.abs.CacheAbs; import com.muyu.common.core.text.Convert; +import com.muyu.product.cache.datasource.ProjectInfoData; import com.muyu.product.domain.ProjectInfo; +import com.muyu.product.domain.ProjectSkuInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; + +/** + * @author DongZl + * @description: 商品缓存 + * @Date 2024-3-27 下午 03:30 + */ @Component public class ProjectInfoCache extends CacheAbs { + public static void main(String[] args) { + Long projectId = 10L; + HashCache hashCache = null; + ArrayList projectSkuInfoList = new ArrayList<>(){{ + add(new ProjectSkuInfo()); + add(new ProjectSkuInfo()); + }}; + hashCache.put(projectId, projectSkuInfoList, ProjectSkuInfo::getProjectId); + Long[] longArr = {10L, 11L, 12L, 13L, 14L, 15L}; + hashCache.get(projectId, longArr); + } + @Autowired private ProjectInfoData projectInfoData; - /** - * key前缀 - * @return key前缀 - */ - @Override - public String keyPre () { - return "project:info:"; - } - - /** - * 解码 - * @param redisKey 数据库键 - * @return ID - */ - @Override - public Long decode(String redisKey){ - return Convert.toLong(redisKey.replace(keyPre(),""),0L); - } - /** * 从数据库获取数据 * @param key ID @@ -48,4 +52,24 @@ public class ProjectInfoCache extends CacheAbs { public ProjectInfo defaultValue() { return new ProjectInfo(); } + + /** + * keye前缀 + * @return key前缀 + */ + @Override + public String keyPre() { + return "project:info:"; + } + + /** + * 解码 + * @param redisKey 数据库键 + * @return ID + */ + @Override + public Long decode(String redisKey) { + return Convert.toLong(redisKey.replace(keyPre(),""),0L); + } + } diff --git a/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectSkuCache.java b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectSkuCache.java new file mode 100644 index 0000000..266fbeb --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectSkuCache.java @@ -0,0 +1,88 @@ +package com.muyu.product.cache; + +import com.muyu.common.cache.abs.HashCacheAbs; +import com.muyu.common.core.text.Convert; +import com.muyu.product.cache.datasource.ProjectSkuData; +import com.muyu.product.domain.ProjectSkuInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author DongZl + * @description: 商品sku基本信息 + * @Date 2024-3-29 下午 03:06 + */ +@Component +public class ProjectSkuCache extends HashCacheAbs { + + @Autowired + private ProjectSkuData projectSkuData; + + + /** + * key前缀 + * @return key前缀 + */ + @Override + public String keyPre () { + return "project:sku:"; + } + + /** + * 解码 + * @param redisKey 数据库键 + * @return ID + */ + @Override + public Long decode (String redisKey) { + return Convert.toLong(redisKey.replace(keyPre(), "")); + } + + /** + * 解码 + * @param redisHashKey 数据库键 + * @return ID + */ + @Override + public String decodeHashKey (String redisHashKey) { + return redisHashKey; + } + + /** + * 通过键获取所有的hash数据 + * @param key 键 + * @return + */ + @Override + public Map getData (Long key) { + return projectSkuData.getData(key); + } + + /** + * 通过缓存键和hash键获取hash值 + * @param key 缓存键 + * @param hashKey hash键 + * + * @return hash值 + */ + @Override + public ProjectSkuInfo getData (Long key, String hashKey) { + return projectSkuData.getData(key, hashKey); + } + + /** + * 默认值 + */ + @Override + public Map defaultValue () { + return new HashMap<>(); + } + + @Override + public ProjectSkuInfo defaultHashValue () { + return new ProjectSkuInfo(); + } +} diff --git a/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectSkuStockCache.java b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectSkuStockCache.java new file mode 100644 index 0000000..b95e9a9 --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectSkuStockCache.java @@ -0,0 +1,61 @@ +package com.muyu.product.cache; + +import com.muyu.common.cache.abs.AtomicSequenceCacheAbs; +import com.muyu.common.core.text.Convert; +import com.muyu.product.cache.datasource.ProjectSkuStockData; +import com.muyu.product.cache.key.SkuStockKey; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author DongZl + * @description: 商品SKU库存缓存 + * @Date 2024-3-29 下午 03:06 + */ +@Service +public class ProjectSkuStockCache extends AtomicSequenceCacheAbs { + + @Autowired + private ProjectSkuStockData projectSkuStockData; + + /** + * key前缀 + * + * @return key前缀 + */ + @Override + public String keyPre () { + return "project:sku:stock:"; + } + + + /** + * 编码 + * @param skuStockKey ID + * @return 键 + */ + @Override + public String encode (SkuStockKey skuStockKey) { + return keyPre() + skuStockKey.getProjectId() + ":" + skuStockKey.getSku(); + } + + @Override + public Long getData (SkuStockKey key) { + return projectSkuStockData.getData(key); + } + + /** + * 解码 + * @param redisKey 数据库键 + * @return ID + */ + @Override + public SkuStockKey decode (String redisKey) { + String[] split = redisKey.replace(keyPre(), "").split(":"); + return SkuStockKey.builder() + .projectId(Convert.toLong(split[0])) + .sku(split[1]) + .build(); + } + +} diff --git a/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectInfoData.java b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/datasource/ProjectInfoData.java similarity index 62% rename from muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectInfoData.java rename to muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/datasource/ProjectInfoData.java index 352311f..0fb0000 100644 --- a/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/ProjectInfoData.java +++ b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/datasource/ProjectInfoData.java @@ -1,7 +1,12 @@ -package com.muyu.product.cache; +package com.muyu.product.cache.datasource; import com.muyu.product.domain.ProjectInfo; +/** + * @author DongZl + * @description: 缓存数据获取 + * @Date 2024-3-27 下午 03:34 + */ public interface ProjectInfoData { /** @@ -10,5 +15,4 @@ public interface ProjectInfoData { * @return 缓存对象 */ public ProjectInfo getData (Long key); - } diff --git a/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/datasource/ProjectSkuData.java b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/datasource/ProjectSkuData.java new file mode 100644 index 0000000..c52f74d --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/datasource/ProjectSkuData.java @@ -0,0 +1,29 @@ +package com.muyu.product.cache.datasource; + +import com.muyu.product.domain.ProjectSkuInfo; + +import java.util.Map; + +/** + * @author DongZl + * @description: 商品SKU数据库读取 + * @Date 2024-4-1 上午 11:35 + */ +public interface ProjectSkuData { + + /** + * 通过键获取所有的hash数据 + * @param projectId 商品ID + * @return + */ + public Map getData (Long projectId) ; + + /** + * 通过缓存键和hash键获取hash值 + * @param projectId 商品ID + * @param projectSku 商品SKU + * + * @return hash值 + */ + public ProjectSkuInfo getData (Long projectId, String projectSku); +} diff --git a/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/datasource/ProjectSkuStockData.java b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/datasource/ProjectSkuStockData.java new file mode 100644 index 0000000..c786c72 --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/datasource/ProjectSkuStockData.java @@ -0,0 +1,13 @@ +package com.muyu.product.cache.datasource; + +import com.muyu.product.cache.key.SkuStockKey; + +/** + * @author DongZl + * @description: SKU库存 + * @Date 2024-4-2 上午 10:52 + */ +public interface ProjectSkuStockData { + + public Long getData (SkuStockKey key) ; +} diff --git a/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/key/SkuStockKey.java b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/key/SkuStockKey.java new file mode 100644 index 0000000..90f4591 --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-cache/src/main/java/com/muyu/product/cache/key/SkuStockKey.java @@ -0,0 +1,28 @@ +package com.muyu.product.cache.key; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author DongZl + * @description: 商品SKU库存Key + * @Date 2024-4-2 上午 10:41 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SkuStockKey { + + /** + * 商品ID + */ + private Long projectId; + + /** + * sku + */ + private String sku; +} diff --git a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectInfoDataImpl.java b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectInfoDataImpl.java index b695424..017380d 100644 --- a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectInfoDataImpl.java +++ b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectInfoDataImpl.java @@ -1,11 +1,16 @@ package com.muyu.product.cache.impl; -import com.muyu.product.cache.ProjectInfoData; +import com.muyu.product.cache.datasource.ProjectInfoData; import com.muyu.product.domain.ProjectInfo; import com.muyu.product.service.ProjectInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +/** + * @author DongZl + * @description: 缓存数据获取 + * @Date 2024-3-27 下午 03:37 + */ @Service public class ProjectInfoDataImpl implements ProjectInfoData { @@ -18,8 +23,7 @@ public class ProjectInfoDataImpl implements ProjectInfoData { * @return 缓存对象 */ @Override - public ProjectInfo getData(Long key) { + public ProjectInfo getData (Long key) { return projectInfoService.getById(key); } - } diff --git a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectSkuDataImpl.java b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectSkuDataImpl.java new file mode 100644 index 0000000..f344707 --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectSkuDataImpl.java @@ -0,0 +1,52 @@ +package com.muyu.product.cache.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.muyu.product.cache.datasource.ProjectSkuData; +import com.muyu.product.domain.ProjectSkuInfo; +import com.muyu.product.service.ProjectSkuInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author DongZl + * @description: 商品SKU实现类 + * @Date 2024-4-1 上午 11:38 + */ +@Service +public class ProjectSkuDataImpl implements ProjectSkuData { + + @Autowired + private ProjectSkuInfoService projectSkuInfoService; + + /** + * 通过键获取所有的hash数据 + * @param projectId 商品ID + * @return + */ + @Override + public Map getData (Long projectId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProjectSkuInfo::getProjectId, projectId); + List projectSkuInfoList = projectSkuInfoService.list(queryWrapper); + return projectSkuInfoList.stream() + .collect(Collectors.toMap(ProjectSkuInfo::getSku, projectSkuInfo -> projectSkuInfo)); + } + + /** + * 通过缓存键和hash键获取hash值 + * @param projectId 商品ID + * @param projectSku 商品SKU + * @return hash值 + */ + @Override + public ProjectSkuInfo getData (Long projectId, String projectSku) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProjectSkuInfo::getProjectId, projectId); + queryWrapper.eq(ProjectSkuInfo::getSku, projectSku); + return projectSkuInfoService.getOne(queryWrapper); + } +} diff --git a/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectSkuStockDataImpl.java b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectSkuStockDataImpl.java new file mode 100644 index 0000000..8bc86dd --- /dev/null +++ b/muyu-modules/muyu-product/muyu-product-server/src/main/java/com/muyu/product/cache/impl/ProjectSkuStockDataImpl.java @@ -0,0 +1,30 @@ +package com.muyu.product.cache.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.muyu.product.cache.datasource.ProjectSkuStockData; +import com.muyu.product.cache.key.SkuStockKey; +import com.muyu.product.domain.ProjectSkuInfo; +import com.muyu.product.service.ProjectSkuInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author DongZl + * @description: sku库存实现类 + * @Date 2024-4-2 上午 10:53 + */ +@Service +public class ProjectSkuStockDataImpl implements ProjectSkuStockData { + + @Autowired + private ProjectSkuInfoService projectSkuInfoService; + + @Override + public Long getData (SkuStockKey key) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProjectSkuInfo::getProjectId, key.getProjectId()); + queryWrapper.eq(ProjectSkuInfo::getSku, key.getSku()); + ProjectSkuInfo projectSkuInfo = projectSkuInfoService.getOne(queryWrapper); + return projectSkuInfo.getStock(); + } +} diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-cache/src/main/java/com/muyu/shop/cart/cache/CartCache.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-cache/src/main/java/com/muyu/shop/cart/cache/CartCache.java new file mode 100644 index 0000000..8255f54 --- /dev/null +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-cache/src/main/java/com/muyu/shop/cart/cache/CartCache.java @@ -0,0 +1,107 @@ +package com.muyu.shop.cart.cache; + +import com.muyu.common.cache.abs.HashCacheAbs; +import com.muyu.common.core.domain.Result; +import com.muyu.common.core.exception.ServiceException; +import com.muyu.common.core.text.Convert; +import com.muyu.shop.cart.cache.key.CartHashKey; +import com.muyu.shop.cart.cache.sourcedata.CartData; +import com.muyu.shop.cart.domain.CartInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @author DongZl + * @description: 购物车缓存 + * @Date 2024-4-2 上午 11:23 + */ +@Component +public class CartCache extends HashCacheAbs { + + @Autowired + private CartData cartData; + + /** + * key前缀 + * @return key前缀 + */ + @Override + public String keyPre () { + return "cart:info:"; + } + + /** + * 解码 + * @param redisKey 数据库键 + * @return ID + */ + @Override + public Long decode (String redisKey) { + return Convert.toLong(redisKey.replace(keyPre(), "")); + } + + /** + * 编码 + * + * @param hashKey ID + * + * @return 键 + */ + @Override + public String encodeHashKey (CartHashKey hashKey) { + return hashKey.getProjectId()+":"+hashKey.getProjectSku(); + } + + /** + * 解码 + * @param redisHashKey 数据库键 + * @return ID + */ + @Override + public CartHashKey decodeHashKey (String redisHashKey) { + String[] split = redisHashKey.split(":"); + return CartHashKey.builder() + .projectId(Convert.toLong(split[0])) + .projectSku(split[1]) + .build(); + } + + /** + * 通过键获取所有的hash数据 + * @param key 键 + * @return + */ + @Override + public Map getData (Long key) { + return cartData.getData(key); + } + + /** + * 通过缓存键和hash键获取hash值 + * + * @param key 缓存键 + * @param hashKey hash键 + * + * @return hash值 + */ + @Override + public CartInfo getData (Long key, CartHashKey hashKey) { + return cartData.getData(key, hashKey); + } + + /** + * 默认值 + */ + @Override + public Map defaultValue () { + throw new ServiceException("购物车无数据", Result.SUCCESS); + } + + @Override + public CartInfo defaultHashValue () { + throw new ServiceException("购物车无数据", Result.SUCCESS); + } + +} diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-cache/src/main/java/com/muyu/shop/cart/cache/key/CartHashKey.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-cache/src/main/java/com/muyu/shop/cart/cache/key/CartHashKey.java new file mode 100644 index 0000000..69fcdf5 --- /dev/null +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-cache/src/main/java/com/muyu/shop/cart/cache/key/CartHashKey.java @@ -0,0 +1,28 @@ +package com.muyu.shop.cart.cache.key; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author DongZl + * @description: 购物车HashKey + * @Date 2024-4-2 上午 11:25 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CartHashKey { + + /** + * 商品ID + */ + private Long projectId; + + /** + * 商品SKU + */ + private String projectSku; +} diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-cache/src/main/java/com/muyu/shop/cart/cache/sourcedata/CartData.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-cache/src/main/java/com/muyu/shop/cart/cache/sourcedata/CartData.java new file mode 100644 index 0000000..0679529 --- /dev/null +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-cache/src/main/java/com/muyu/shop/cart/cache/sourcedata/CartData.java @@ -0,0 +1,31 @@ +package com.muyu.shop.cart.cache.sourcedata; + +import com.muyu.shop.cart.cache.key.CartHashKey; +import com.muyu.shop.cart.domain.CartInfo; + +import java.util.Map; + +/** + * @author DongZl + * @description: 购物车源数据获取 + * @Date 2024-4-2 上午 11:49 + */ +public interface CartData { + + /** + * 通过键获取所有的hash数据 + * @param key 键 + * @return + */ + public Map getData (Long key); + + /** + * 通过缓存键和hash键获取hash值 + * + * @param key 缓存键 + * @param hashKey hash键 + * + * @return hash值 + */ + public CartInfo getData (Long key, CartHashKey hashKey); +} diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/CartInfo.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/CartInfo.java index 6b93c7b..dd9dc61 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/CartInfo.java +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-common/src/main/java/com/muyu/shop/cart/domain/CartInfo.java @@ -86,7 +86,7 @@ public class CartInfo extends BaseEntity { /** * 修改构造器 */ - public static CartInfo editBuid(Long id, CartInfoEditReq cartInfoEditReq){ + public static CartInfo editBuild(Long id, CartInfoEditReq cartInfoEditReq){ return CartInfo.builder() .id(id) .projectId(cartInfoEditReq.getProjectId()) diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/pom.xml b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/pom.xml index 540f5a5..760ad7b 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/pom.xml +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/pom.xml @@ -84,7 +84,12 @@ com.muyu muyu-shop-cart-common - ${muyu.version} + + + + + com.muyu + muyu-shop-cart-cache diff --git a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/controller/CartInfoController.java b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/controller/CartInfoController.java index d5cfad9..0fe835c 100644 --- a/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/controller/CartInfoController.java +++ b/muyu-modules/muyu-shop-cart/muyu-shop-cart-server/src/main/java/com/muyu/shop/cart/controller/CartInfoController.java @@ -1,31 +1,41 @@ package com.muyu.shop.cart.controller; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import com.muyu.common.core.domain.Result; import com.muyu.common.core.utils.poi.ExcelUtil; import com.muyu.common.core.web.controller.BaseController; -import com.muyu.common.core.web.page.TableDataInfo; import com.muyu.common.log.annotation.Log; import com.muyu.common.log.enums.BusinessType; import com.muyu.common.security.annotation.RequiresPermissions; import com.muyu.shop.cart.domain.CartInfo; -import com.muyu.shop.cart.domain.req.CartInfoEditReq; import com.muyu.shop.cart.domain.req.CartInfoQueryReq; import com.muyu.shop.cart.domain.req.CartInfoSaveReq; +import com.muyu.shop.cart.domain.req.CartInfoEditReq; import com.muyu.shop.cart.service.CartInfoService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; +import com.muyu.common.core.web.page.TableDataInfo; +/** + * 购物车Controller + * + * @author DongZeLiang + * @date 2024-03-29 + */ @Api(tags = "购物车") @RestController @RequestMapping("/Info") public class CartInfoController extends BaseController { - @Autowired private CartInfoService cartInfoService; @@ -35,7 +45,7 @@ public class CartInfoController extends BaseController { @ApiOperation("获取购物车列表") @RequiresPermissions("shopCart:Info:list") @GetMapping("/list") - public Result> list(CartInfoQueryReq cartInfoQueryReq){ + public Result> list(CartInfoQueryReq cartInfoQueryReq) { startPage(); List list = cartInfoService.list(CartInfo.queryBuild(cartInfoQueryReq)); return getDataTable(list); @@ -46,9 +56,9 @@ public class CartInfoController extends BaseController { */ @ApiOperation("导出购物车列表") @RequiresPermissions("shopCart:Info:export") - @Log(title = "购物车",businessType = BusinessType.EXPORT) + @Log(title = "购物车", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response,CartInfo cartInfo){ + public void export(HttpServletResponse response, CartInfo cartInfo) { List list = cartInfoService.list(cartInfo); ExcelUtil util = new ExcelUtil(CartInfo.class); util.exportExcel(response, list, "购物车数据"); @@ -61,7 +71,7 @@ public class CartInfoController extends BaseController { @RequiresPermissions("shopCart:Info:query") @GetMapping(value = "/{id}") @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long", paramType = "path", dataTypeClass = Long.class) - public Result getInfo(@PathVariable("id") Long id){ + public Result getInfo(@PathVariable("id") Long id) { return Result.success(cartInfoService.getById(id)); } @@ -69,10 +79,10 @@ public class CartInfoController extends BaseController { * 新增购物车 */ @RequiresPermissions("shopCart:Info:add") - @Log(title = "购物车",businessType = BusinessType.INSERT) + @Log(title = "购物车", businessType = BusinessType.INSERT) @PostMapping @ApiOperation("新增购物车") - public Result add(@RequestBody CartInfoSaveReq cartInfoSaveReq){ + public Result add(@RequestBody CartInfoSaveReq cartInfoSaveReq) { return toAjax(cartInfoService.save(CartInfo.saveBuild(cartInfoSaveReq))); } @@ -80,22 +90,22 @@ public class CartInfoController extends BaseController { * 修改购物车 */ @RequiresPermissions("shopCart:Info:edit") - @Log(title = "购物车",businessType = BusinessType.UPDATE) + @Log(title = "购物车", businessType = BusinessType.UPDATE) @PutMapping("/{id}") @ApiOperation("修改购物车") - public Result edit(@PathVariable Long id, @RequestBody CartInfoEditReq cartInfoEditReq){ - return toAjax(cartInfoService.updateById(CartInfo.editBuid(id,cartInfoEditReq))); + public Result edit(@PathVariable Long id, @RequestBody CartInfoEditReq cartInfoEditReq) { + return toAjax(cartInfoService.updateById(CartInfo.editBuild(id,cartInfoEditReq))); } /** * 删除购物车 */ @RequiresPermissions("shopCart:Info:remove") - @Log(title = "购物车",businessType = BusinessType.DELETE) + @Log(title = "购物车", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") @ApiOperation("删除购物车") @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long", paramType = "path", dataTypeClass = String.class, example = "1,2,3,4") - public Result remove(@PathVariable List ids){ + public Result remove(@PathVariable List ids) { return toAjax(cartInfoService.removeBatchByIds(ids)); } } diff --git a/muyu-modules/muyu-shop-cart/pom.xml b/muyu-modules/muyu-shop-cart/pom.xml index d944d40..a3d4074 100644 --- a/muyu-modules/muyu-shop-cart/pom.xml +++ b/muyu-modules/muyu-shop-cart/pom.xml @@ -15,6 +15,7 @@ muyu-shop-cart-common muyu-shop-cart-remote muyu-shop-cart-server + muyu-shop-cart-cache diff --git a/pom.xml b/pom.xml index 1e51183..818b6c1 100644 --- a/pom.xml +++ b/pom.xml @@ -143,13 +143,6 @@ ${transmittable-thread-local.version} - - - com.muyu - muyu-common-cache - ${muyu.version} - - com.muyu @@ -157,6 +150,13 @@ ${muyu.version} + + + com.muyu + muyu-common-cache + ${muyu.version} + + com.muyu @@ -227,6 +227,34 @@ ${muyu.version} + + + com.muyu + muyu-product-cache + ${muyu.version} + + + + + com.muyu + muyu-shop-cart-common + ${muyu.version} + + + + + com.muyu + muyu-shop-cart-remote + ${muyu.version} + + + + + com.muyu + muyu-shop-cart-cache + ${muyu.version} + +