SpringCloudAlibaba云商场-高性能门户网构建(六)

39 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

每日英语:

I never look back,darling.It distracts me from the now.

翻译:我从不回看过去,亲爱的。因为那样会使人对现在分心。 -《超人总动员》

1.测试一下@CachePut注解

@CachePut还是加在com.xz.mall.goods.service.impl.SkuServiceImpl中的 typeSkuItems 方法上,测试一下看看,代码如下:

@CachePut(cacheNames = "ad-items-skus", key = "#id")
@Override
public List<Sku> typeSkuItems(Integer id) {
    //1.查询当前分类下的所有列表信息
    QueryWrapper<AdItems> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("type", id);
    List<AdItems> adItems = adItemsMapper.selectList(queryWrapper);
    //2.根据推广列表查询产品列表信息
    List<String> skuIds = adItems.stream().map(AdItems::getSkuId).collect(Collectors.toList());
    return skuMapper.selectBatchIds(skuIds);
}

重启项目后,用postman进行测试,点击三次

CachePut测试.jpg 我们从日志可以看到他每次都去查询了数据库,查询完后,把数据放到redis中,并没有用redis中的缓存

2.缓存清理

1)service

接口:添加清理缓存方法com.xz.mall.goods.service.SkuService,方法名为delTypeSkuItems,代码如下:

/**
 * 清理分类ID下的推广产品
 * @param id
 */
void delTypeSkuItems(Integer id);

对应的实现类,添加到com.xz.mall.goods.service.impl.SkuServiceImpl,方法为delTypeSkuItems,代码如下:

/**
 * 清理分类ID下的推广产品
 * @param id
 */
@CacheEvict(cacheNames = "ad-items-skus", key = "#id")
@Override
public void delTypeSkuItems(Integer id) {

}

2)controller

添加删除缓存方法到com.xz.mall.goods.controller.SkuController,方法名为delTypeItems,代码如下:

/**
 * 删除指定分类下的推广产品列表
 */
@DeleteMapping(value = "/aditems/type")
public RespResult delTypeItems(@RequestParam(value = "id") Integer id) {
    skuService.delTypeSkuItems(id);
    return RespResult.ok();
}

3)用postman测试一下,会看到清除了redis中的缓存

3.注解缓存操作优化

使用@CacheConfig优化注解,可以将cacheNames挪到类上,每个方法上就不用重复写cacheNames了。

com.xz.mall.goods.service.impl.SkuServiceImpl类上增加注解

@CacheConfig(cacheNames = "ad-items-skus")
@Service
public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements SkuService {

把实现类中的各个方法上的注解调整一下

@Cacheable(key = "#id")
@Override
public List<Sku> typeSkuItems(Integer id)
@CachePut(key = "#id")
@Override
public List<Sku> updateTypeSkuItems(Integer id)
@CacheEvict(key = "#id")
@Override
public void delTypeSkuItems(Integer id) 

其他地方肯定会调用这几个方法用于实现缓存更新,我们可以在goods-api中添加feigin接口。

mall-api中引入common工具包和feign依赖包:

<!--工具包-->
<dependency>
    <groupId>com.xz</groupId>
    <artifactId>mall-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
<!--openfeign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

mall-goods-api中创建feign包,创建com.xz.mall.goods.feign.SkuFeign,代码如下:

@FeignClient(value = "mall-goods")
public interface SkuFeign {

    /**
     * 根据推广分类查询推广产品列表
     */
    @GetMapping(value = "/aditems/type/{id}")
    List<Sku> typeItems(@PathVariable("id") Integer id);


    /**
     * 删除指定分类下的推广产品列表
     */
    @DeleteMapping(value = "/aditems/type/{id}")
    RespResult delTypeItems(@PathVariable(value = "id") Integer id);

    /**
     * 修改指定分类下的推广产品列表
     */
    @PutMapping(value = "/aditems/type/{id}")
    RespResult<List<Sku>> updateTypeItems(@PathVariable("id") Integer id);
}

总结:本篇主要介绍了一下@CachePut、@CacheEvict、@CacheConfig的大致用法,有兴趣的,大家可以去自行尝试一下。