背景:由于理财专区二期的基金数据一天更新一次。并且都是非操作型数据。后台会将数据缓存起来。每日更新一次。上周的做法是在control层编码方式的添加缓存服务。今天尝试了通过在方法上定义@PageCache,达到的缓存。大家看看,给点意见。
实现方式:
在需要缓存的方法上添加标注
@PageCache
public void queryFundList(InputArg arg){}
入参实现PageCacheKey接口。以便在ModelAndView中获得此次请求的cacheKey
class InputArg implements PageCacheKey{
public String getCacheKey();
}
PageCacheAop中,拦截@pageCache的请求
获得入参的cacheKey,检查cache是否命中
CacheJSONView中在ModelAndView中获得入参的cacheKey,取出缓存
调用流程:

文字说明:
页面请求a.cjson(新增一种CacheJSONView)
spring mvc controler调用代理过的服务,
代理对象坚持缓存是否命中,决定是否调用真正服务。
命中则直接return,在CacheJSONView中取出缓存的string,直接输出。
没命中则调用后返回ModelAndView,在CacheJSONView中输出后放入缓存。
这种方式的优势是直接在View层缓存。
入参实现PageCacheKey接口的getCacheKey方法,
通过CacheJSONView与代理的对象注入相同的cache服务,并通过cacheKey检查缓存。
劣势是需要添加CacheJSONView,并且访问路径是新增的*.cjson后缀。需要改动sm里面的东西
另外一个方案是,
不在View层缓存。在PageCacheAop中直接返回缓存后的对象。
这种方式优势是无须新增view,只需无须改动sm的东西。并且可以在sm原有的xml,json等方式输出。
劣势是每次返回的对象都会在各自的view中解析成对应协议的数据。如ModelAndView->JSONObject ->String.
大家发表一下意见。看看哪种方式更好。