发表于: 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 多模块打包搞定,部署测试,结束任务八





返回列表 返回列表
评论

    分享到