携手创作,共同成长!这是我参与「掘金日新计划 · 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进行测试,点击三次
我们从日志可以看到他每次都去查询了数据库,查询完后,把数据放到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的大致用法,有兴趣的,大家可以去自行尝试一下。