发表于: 2020-07-22 23:07:39
1 1296
今天完成的事情
1. 看了一下 spring 的缓存注解,重写缓存
遇到的问题
1. maven 多模块项目打包失败
很尴尬,这个多项目打包的水有点深。搞了半天没有搞好
项目写好了,测试好了没法打包是真的很尴尬。希望明天能够顺利解决。
收获
1. spring 缓存注解
@Cacheable 作用于字段与方法,用于设定缓存 key,运行方法前会判断有无缓存,有则直接返回,不运行注解的方法
@Cacheput 作用于方法与字段,不判断,直接刷新缓存
@CacheEvict 作用于方法于字段,用于删除指定缓存,可以设置 beforeInvocation 属性,在方法运行前就删除缓存
@Caching 用于组合上述的注解,即在这个注解中可以写多个缓存注解
@Caching(
put = {
@CachePut(value = "user", key = "#name"), // 在 user 数据库中存入方法返回值 key 为方法参数 name
@CachePut(value = "user", key = "#result.id") // 在 user 数据库中存入方法返回值,key 为返回值的 id
},
evict = {
@CacheEvict(value = "user", key = "#name", condition = "#result.email != null ") // 如果返回对象的邮件地址为空就在 user 数据库中删除 key 为方法参数 name 的数据
}
)
这里只是做一个演示,实际上用起来还有很多其他的操作,我没玩透。
在上述注解中还可以设置判断语句,符合一定的条件再进行缓存操作,使用 SpEL 可以取方法名、类名、返回值与方法参数列表,甚至是返回值与参数列表内部的字段····
简直打开了新世界的大门。
@CacheConfig 作用于类,设定全类的 key 前缀,避免在 @Cacheable 注解中重复写 value/cacheNames(这两个等价)
这里有一个概念我原来一直不知道,所以看注解的时候有很多不太清楚。
在 spring 中 key 不是我原来认识的那个 key、value 也不是我原来认识的那个value。
@Service
@CacheConfig(cacheNames = "banner")
public class BannerServiceImpl implements BannerService {
private static final Logger LOGGER = LogManager.getLogger(BannerServiceImpl.class);
@Autowired
BannerMapper bannerMapper;
/**
* @Description: 获取首页轮播图
* @Param: []
* @return: java.util.List<cn.mogeek.jsptiles.model.Banner>
* @Author: owlwinter
* @Date: 2020/6/16
*/
@Cacheable(key = "#root.method")
@Override
public List<Banner> list(){
List<Banner> banners = bannerMapper.selectByExample(new BannerExample());
return banners;
}
}
与上面等价的缓存注解写法是掉类上面的 @CacheConfig 注解,
类上的注解改为 @Cacheable(value = "banner", key = "#root.method")
或者是 @Cacheable(cacheNames = "banner", key = "#root.method")
以上两种写法与上面代码的效果是一样的。
在 redis 客户端中查询得到 key 的数据是这样的,value 我就不展示了,序列化的数据没什么好看的
这个操作其实是 spring 给我们的 redis 缓存数据分了不同的数据库,具体的实现我不知道,我现在也没有玩通。
今天尝试了一些操作,总之非常灵活,超出我的想象。
明天的计划
1. 把 maven 多模块打包搞定,部署测试,结束任务八
评论