Spring Cache 自定义注解

1.在使用spring cache注解如cacheable、cacheevict、cacheput过程中有一些问题;

比如,我们在查到一个list后,可以将list缓存到一个键对应的区域里;当新增、修改、删除一个元素的时候,其实我们

需要的是只将cache的list里的元素变动就可以了,但因为只有一个键,没法做到只更改一个元素,只能整个list重新加载,

对性能还是有一定的影响;

2.对spring扩展,增加自定义cache,

@MyCacheDelete:当删除元素后,从cache里取出该key的缓存list,从list里删除指定id的元素,再将list写入缓存;

@MyCachePut :当新增修改元素后,从cache里找到该key对应的list,从list里找到修改的元素删除(新增不需要删除),然后将修改后的记录写入list,再将list写入缓存;

3.具体的步骤:

1)定义注解@MyCacheDelete,@MyCachePut

2)定义注解拦截器

clip_image001[4]

该拦截器,其中最重要的一点就是解析key值,因为在缓存查询数据时我们还是使用cacheable,所以定义的key也要和cacheable一致;

@MyCachePut( key="'"+ ConstUtil.C_CACHE_KEY_PRE+"BasicData'+#info.parentId",value = ConstUtil.C_CACHE_NAME, pid = "recid")

上面info.parentId的值, 是spring表达式运行时解析出的;所以自定义拦截器里也要和spring框架一样算出key值;

这里重新实现了CacheAnnotationParser,让它解析自定义的注解,这样,可以调用spring框架里的generateKey;

clip_image002

3)有了cache的key,后面就简单了,就是从cache里的取数据、修改数据、更新缓存操作了;

虽然这种方式,解决了单条数据影响cache的list重新加载问题;但我们在设计缓存时,还是要尽量通过细分的业务去缓存对应的数据,不要让

缓存的list过大,过大的list对于cache的存取、序列化反序列化都有性能的影响;

posted @ 2016-05-23 16:29  sl521100  阅读(6154)  评论(0编辑  收藏  举报