jfinal缓存更新问题

kidbei 发布于 2013/06/09 20:58
阅读 1K+
收藏 0

@jfinal  前辈你好,在jfinal中使用@Before(CacheInterceptor.class)能将action中需要的数据缓存起来,

这个功能有点儿不方便。比如我要查看一篇文章,查看文章的action方法把文章缓存起来了,此时作者又编辑了这篇文章,我该怎么清楚这篇文章的缓存呢?用EvictInterceptor只能将全部文章的缓存都清除

正常做法是用文章的id当缓存的key,在spring中可以用它的表达式注解一下来取得方法参数中的文章ID,

但是jfinal的注解不支持表达式,而且action方法中又没有参数。

这个问题有点儿棘手,请前辈给个解决办法吧~~~

不想用CacheKit来操作缓存,有点儿乱

加载中
0
玛雅牛
玛雅牛

com.jfinal.plugin.ehcache.CacheName 是一个注解,


@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface CacheName {
	String value();
}
CacheInterceptor 里会获取这个注解。



private String buildCacheName(ActionInvocation ai, Controller controller) {
		CacheName cacheName = ai.getMethod().getAnnotation(CacheName.class);
		if (cacheName != null)
			return cacheName.value();
		cacheName = controller.getClass().getAnnotation(CacheName.class);
		ret

也就是说这个CacheName("blogList")可以用在Controller类上,或者Controller的方法上。然后更新时,你自己再将相应的cache清除掉即可。

多看源码,JFinal的作者考虑还是很周到的。


kidbei
kidbei
谢谢赐教,可能我是描述得不清楚,我知道它怎么实现的,如果只是缓存blogList,确实够了,但是如果我要缓存一篇blog文章呢?我需要用blog的ID来当key,当blog文章被编辑时我只需要根据KEY来清楚文章的缓存了,jfinal的注解是做不到的。
0
玛雅牛
玛雅牛
CacheInterceptor 的源码仔细看一下,就知道该怎么做了。
0
JFinal
JFinal

1:JFinal CachePlugin作为框架的一部分存在,需要解决的是通用的问题,所以有时无法更细粒度地管理Cache。如果想更细粒度地管理缓存,可以参照EvictInterceptor自己写个MyEvictInterceptor来做到。

2:Spring的作法不太了解,可能是个好的解决方案,但或许也提升了复杂度,并且开发者需要学习新的知识,比如说学习这个表达式的约定与用法,请楼主将spring的作法贴出来看看,JFinal看能否改进。

3:一般的项目是读多写少,在并发度并不是特别高的清况下,当缓存中的部分数据变“脏”时,对整部分数据重新加载也是可以接受的。

4:还可以通过只缓存id 的方式来做,取内容时每次都是重新读数据库

0
kidbei
kidbei

spring的实现:

@Cacheable(value="articleCache",key="#root.methodName+p0")
public Blog blog(String blogId){

}

表示将blog()方法的返回值存入名称为articleCache键为方法名+方法中第一个参数的值

@jfinal

0
JFinal
JFinal

引用来自“kidbei”的答案

spring的实现:

@Cacheable(value="articleCache",key="#root.methodName+p0")
public Blog blog(String blogId){

}

表示将blog()方法的返回值存入名称为articleCache键为方法名+方法中第一个参数的值

@jfinal

没看出来如何对特定数据进行更新,例如缓存的是一个 list,其中的一条数据更新了,如果加载更新这条数据
0
kidbei
kidbei

这是说明spring的缓存注解是支持用表达式来取方法参数的,可以用方法参数为键,缓存一个list当然是清除整个缓存了。有一个需求,比如当你查看一篇文章的时候必然要传文章的id到后台,然后去数据库取文章的内容等信息,spring的action可以接受参数绑定,比如public  void view(String articleId){

}

这样就可以用上面的注解将文章id为参数值的文章内容全部缓存起来,更新文章的时候同样需要传id到后台,这样就可以用注解@CacheEvict()加表达式来清除指定的缓存。如果只是查询一个文章确实可以用CacheKit来手动操作缓存,但是我需要在action方法中查询多个地方的数据,就是想知道有没有办法用AOP注解来操作缓存。


返回顶部
顶部