论坛首页 Java企业应用论坛

使用Spring3.1注解 缓存 模糊匹配Evict的问题

浏览 9799 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-05-12  

因为最近用到Spring 3.1的注解cache.小弟有个问题想请教.

比如说在分页查询时 我想缓存

@Cacheable(value="posts",key="'getPosts_'+#blogId+'_'+#firstindex+'_'+#maxresult")
	public QueryResult<Posts> getPosts(Integer blogId, int firstindex,int maxresult) {
		...
	}

 此时是进行分页的缓存, 表示查询的是blog为id的用户下从firstindex开始一共maxresult条博客文章记录.

但是如果该用户添加或修改了一篇文章 那么这个缓存就应该evict.

public void update(Posts post) {
		baseDao.update(post);
	}
 blogId我可以使用Spring el 【#post.blog.id】拿到,这个时候我要清理缓存就要进行模糊的匹配

类似于这样的

@CacheEvict(value="posts",key="'getPosts_'+#post.blogs.id+'_*'"),
 就是把【#firstindex+'_'+#maxresult】换成了【*】.但是Spring EL不支持这样的写法.查了文档也没看到Spring EL支持*匹配的.

不知道怎么个写法能解决这个问题,或者说换个换个缓存的思路?

 
   发表时间:2012-05-12   最后修改:2012-05-12
cache只是key-value 不支持模糊删除的。

建议:
摒弃Spring的注解式Cache,自己使用AOP来实现。

思路1,使用现有的缓存框架,如Ehcache:
1、select时
    blogId_pages ------>  记录分页页码数据(这样当清除时 可以根据缓存的页码删除)  缓存多少页需要根据自己的需求制定
    blogId-page ------>  缓存每页的数据

2、update/delete/insert
    首先查询blogId_pages  得到所有缓存的页码  再根据页码删除 blog-page 缓存的数据即可

帖子缓存可以根据热门度缓存,如一个帖子一天只有10个访问量 可以考虑不缓存!


思路2,构建自己的缓存数据结构,如使用LinkedHashMap构建LRU缓存:
1、帖子Map
   <帖子id, 回复分页Map>

2、回复分页Map
   <页码, 分页数据>    

欢迎讨论
1 请登录后投票
   发表时间:2012-05-12  
jinnianshilongnian 写道
cache只是key-value 不支持模糊删除的。

建议:
摒弃Spring的注解式Cache,自己使用AOP来实现。

思路1,使用现有的缓存框架,如Ehcache:
1、select时
    blogId_pages ------>  记录分页页码数据(这样当清除时 可以根据缓存的页码删除)  缓存多少页需要根据自己的需求制定
    blogId-page ------>  缓存每页的数据

2、update/delete/insert
    首先查询blogId_pages  得到所有缓存的页码  再根据页码删除 blog-page 缓存的数据即可

帖子缓存可以根据热门度缓存,如一个帖子一天只有10个访问量 可以考虑不缓存!


思路2,构建自己的缓存数据结构,如使用LinkedHashMap构建LRU缓存:
1、帖子Map
   <帖子id, 回复分页Map>

2、回复分页Map
   <页码, 分页数据>    

欢迎讨论

感谢大哥提供思路,本来也是打算自己结合ehcache写一个的.谢谢.
0 请登录后投票
   发表时间:2012-05-12  
cowboy_bebop 写道
jinnianshilongnian 写道
cache只是key-value 不支持模糊删除的。

建议:
摒弃Spring的注解式Cache,自己使用AOP来实现。

思路1,使用现有的缓存框架,如Ehcache:
1、select时
    blogId_pages ------>  记录分页页码数据(这样当清除时 可以根据缓存的页码删除)  缓存多少页需要根据自己的需求制定
    blogId-page ------>  缓存每页的数据

2、update/delete/insert
    首先查询blogId_pages  得到所有缓存的页码  再根据页码删除 blog-page 缓存的数据即可

帖子缓存可以根据热门度缓存,如一个帖子一天只有10个访问量 可以考虑不缓存!


思路2,构建自己的缓存数据结构,如使用LinkedHashMap构建LRU缓存:
1、帖子Map
   <帖子id, 回复分页Map>

2、回复分页Map
   <页码, 分页数据>    

欢迎讨论

感谢大哥提供思路,本来也是打算自己结合ehcache写一个的.谢谢.

客气,你试试,不一定满足你的需求,等你有了好的想法,把实现思路给大家讲讲 
0 请登录后投票
   发表时间:2012-05-13  
spring cache 的重点在于cache、put、evict之间的关系 而不是怎么去存、存在哪里
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics