Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
有来开源组织
youlai-mall
提交
05dd9a07
Y
youlai-mall
项目概览
有来开源组织
/
youlai-mall
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
youlai-mall
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
05dd9a07
编写于
6月 21, 2021
作者:
D
DaniR
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(PmsConstants.java): 商品详情缓存
1、添加商品详情本地缓存 2、商品详情分布式锁保证原子操作 Closes I3V770
上级
17dc8fdb
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
117 addition
and
26 deletion
+117
-26
mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/common/constant/PmsConstants.java
...ava/com/youlai/mall/pms/common/constant/PmsConstants.java
+4
-0
mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/config/ProductLocalCache.java
...in/java/com/youlai/mall/pms/config/ProductLocalCache.java
+42
-0
mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/impl/ProductServiceImpl.java
.../com/youlai/mall/pms/service/impl/ProductServiceImpl.java
+71
-26
未找到文件。
mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/common/constant/PmsConstants.java
浏览文件 @
05dd9a07
...
...
@@ -9,4 +9,8 @@ public interface PmsConstants {
String
LOCKED_STOCK_PREFIX
=
"stock:locked:"
;
String
LOCK_SKU_PREFIX
=
"lock:sku:"
;
String
PRODUCT_DETAIL_CACHE
=
"product:detail:cache:"
;
String
LOCK_PRODUCT_DETAIL
=
"lock:product:detail"
;
}
mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/config/ProductLocalCache.java
0 → 100644
浏览文件 @
05dd9a07
package
com.youlai.mall.pms.config
;
import
com.google.common.cache.Cache
;
import
com.google.common.cache.CacheBuilder
;
import
com.youlai.mall.pms.pojo.dto.app.ProductFormDTO
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.PostConstruct
;
import
java.util.concurrent.TimeUnit
;
/**
* @author DaniR
* @version 1.0
* @description 本地缓存设置
* @createDate 2021/6/16 10:08
*/
@Slf4j
@Component
public
class
ProductLocalCache
{
private
Cache
<
String
,
ProductFormDTO
>
localCache
=
null
;
@PostConstruct
private
void
init
(){
localCache
=
CacheBuilder
.
newBuilder
()
//设置本地缓存容器的初始容量
.
initialCapacity
(
10
)
//设置本地缓存的最大容量
.
maximumSize
(
500
)
//设置写缓存后多少秒过期
.
expireAfterWrite
(
60
,
TimeUnit
.
SECONDS
).
build
();
}
public
void
setLocalCache
(
String
key
,
ProductFormDTO
object
){
localCache
.
put
(
key
,
object
);
}
public
ProductFormDTO
get
(
String
key
){
return
localCache
.
getIfPresent
(
key
);
}
}
mall-pms/pms-boot/src/main/java/com/youlai/mall/pms/service/impl/ProductServiceImpl.java
浏览文件 @
05dd9a07
...
...
@@ -5,36 +5,65 @@ import cn.hutool.core.util.StrUtil;
import
cn.hutool.json.JSONUtil
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.youlai.common.redis.utils.RedisUtils
;
import
com.youlai.mall.pms.config.ProductLocalCache
;
import
com.youlai.mall.pms.mapper.PmsSpuMapper
;
import
com.youlai.mall.pms.pojo.dto.SpuDTO
;
import
com.youlai.mall.pms.pojo.dto.app.ProductFormDTO
;
import
com.youlai.mall.pms.pojo.entity.PmsSpuAttributeValue
;
import
com.youlai.mall.pms.pojo.entity.PmsSku
;
import
com.youlai.mall.pms.pojo.entity.PmsSpec
;
import
com.youlai.mall.pms.pojo.entity.PmsSpu
;
import
com.youlai.mall.pms.pojo.dto.SpuDTO
;
import
com.youlai.mall.pms.service.IPmsSpuAttributeValueService
;
import
com.youlai.mall.pms.pojo.entity.PmsSpuAttributeValue
;
import
com.youlai.mall.pms.service.IPmsSkuService
;
import
com.youlai.mall.pms.service.IPmsSpecService
;
import
com.youlai.mall.pms.service.IPmsSpuAttributeValueService
;
import
com.youlai.mall.pms.service.IProductService
;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.redisson.api.RLock
;
import
org.redisson.api.RedissonClient
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
import
static
com
.
youlai
.
mall
.
pms
.
common
.
constant
.
PmsConstants
.
LOCK_PRODUCT_DETAIL
;
import
static
com
.
youlai
.
mall
.
pms
.
common
.
constant
.
PmsConstants
.
PRODUCT_DETAIL_CACHE
;
/**
* @author haoxr
* @date 2020-11-06
*/
@Service
@Slf4j
@AllArgsConstructor
public
class
ProductServiceImpl
extends
ServiceImpl
<
PmsSpuMapper
,
PmsSpu
>
implements
IProductService
{
private
IPmsSkuService
iPmsSkuService
;
private
IPmsSpuAttributeValueService
iPmsSpuAttributeValueService
;
private
IPmsSpecService
iPmsSpecService
;
private
final
IPmsSkuService
iPmsSkuService
;
private
final
IPmsSpuAttributeValueService
iPmsSpuAttributeValueService
;
private
final
IPmsSpecService
iPmsSpecService
;
private
final
RedisUtils
redisUtils
;
private
final
RedissonClient
redissonClient
;
private
final
ProductLocalCache
productLocalCache
;
@Override
public
ProductFormDTO
getProductById
(
Long
spuId
)
{
//1、一级本地缓存设置
ProductFormDTO
product
=
productLocalCache
.
get
(
PRODUCT_DETAIL_CACHE
+
spuId
);
if
(
null
!=
product
)
{
log
.
info
(
"get LocalCache product:"
+
product
);
return
product
;
}
//2、二级缓存设置,Redis中获取商品详情信息
product
=
(
ProductFormDTO
)
redisUtils
.
get
(
PRODUCT_DETAIL_CACHE
+
spuId
);
if
(
null
!=
product
)
{
log
.
info
(
"get redis product:"
+
product
);
return
product
;
}
//3、分布式锁,保证原子操作
RLock
lock
=
redissonClient
.
getLock
(
LOCK_PRODUCT_DETAIL
+
spuId
);
try
{
if
(
lock
.
tryLock
())
{
// spu
PmsSpu
spu
=
this
.
getById
(
spuId
);
SpuDTO
SpuDTO
=
new
SpuDTO
();
...
...
@@ -49,14 +78,30 @@ public class ProductServiceImpl extends ServiceImpl<PmsSpuMapper, PmsSpu> implem
new
LambdaQueryWrapper
<
PmsSpuAttributeValue
>(
).
eq
(
PmsSpuAttributeValue:
:
getSpuId
,
spuId
)
);
// 规格
List
<
PmsSpec
>
specs
=
iPmsSpecService
.
listBySpuId
(
spuId
);
// sku
List
<
PmsSku
>
skuList
=
iPmsSkuService
.
list
(
new
LambdaQueryWrapper
<
PmsSku
>().
eq
(
PmsSku:
:
getSpuId
,
spuId
));
ProductFormDTO
product
=
new
ProductFormDTO
(
SpuDTO
,
attrs
,
specs
,
skuList
);
product
=
new
ProductFormDTO
(
SpuDTO
,
attrs
,
specs
,
skuList
);
//TODO 4、需要判断商品是否是秒杀商品,根据秒杀信息更新商品秒杀相关信息
log
.
info
(
"get db product:"
+
product
);
redisUtils
.
set
(
PRODUCT_DETAIL_CACHE
+
spuId
,
product
,
3600
);
productLocalCache
.
setLocalCache
(
PRODUCT_DETAIL_CACHE
+
spuId
,
product
);
}
else
{
log
.
info
(
"get redis2 product:"
+
product
);
product
=
(
ProductFormDTO
)
redisUtils
.
get
(
PRODUCT_DETAIL_CACHE
+
spuId
);
if
(
null
!=
product
)
{
productLocalCache
.
setLocalCache
(
PRODUCT_DETAIL_CACHE
+
spuId
,
product
);
}
}
}
finally
{
if
(
lock
.
isLocked
())
{
if
(
lock
.
isHeldByCurrentThread
())
{
lock
.
unlock
();
}
}
}
return
product
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录