`
aa87963014
  • 浏览: 150532 次
  • 性别: Icon_minigender_1
  • 来自: 布尼塔尼亚
社区版块
存档分类
最新评论

spring cache 拓展

 
阅读更多

spring cache 的一大缺陷是无法对集合缓存操作

例如:信箱功能

 

 

@Cacheable(value="mailCache",key="#uid+'list'")
public List<Mail> getMails(Integer uid);

@Cacheable(value = "mailCache", key = "#id")
public Mail getMail(Integer id);

@CacheEvict(value = "mailCache", key = "#mail.uid + 'list'")
@CachePut(value = "mailCache", key = "#mail.id")
public Mail update(Mail mail);

@CacheEvict(value = "mailCache", key = "#mail.uid + 'list'")
public Mail saveMail(Mail mail);

 

 

 

 

这4个接口是一个典型的数据操作接口,get、update、save、findList

 

其中的缓存的处理分为2部分:实体缓存(get、update、save)、集合缓存(findList)

 

1、执行get 方法把Mail实体缓存起来

2、执行getMail方法把Mail集合缓存起来

3、执行update更新Maill实体缓存并且清除Mail的集合缓存

4、执行save清除Mail的集合缓存

 

以上4点的问题所在:

1、save操作无法缓存Mail(因为缺少主键ID,Spring Cache限定了只能从参数中解析key)

2、save、update只能清除Mail的集合缓存,降低了集合缓存的利用率

 

 

为此,拓展Spring AOP Cache 添加annotation:@CacheUpdate、@CacheDelete、@CacheSave

 

1、在@CacheSave注解下,通过方法的返回值生成key,并且把返回值添加至集合Cache中。并且把返回值缓存起来

2、在@CahceUpdate注解下,通过参数生成key,并且把返回值更新至集合Cache中

3、在@CacheDelete注解下,通过参数生成key,并且从集合Cache中移除该实体

4、在@CacheDelete注解下,可以缓存住删除操作

 

以上3点做法的缺陷:

1、@CacheSave不保证顺序

2、@CacheUpdate需要自行考虑是否适用。例如:

 

 

@Cacheable(value="mailCache",key="#uid+'list'")
public List<Mail> getUnReadMails(Integer uid,boolean read){
     return find("select * from Mail where uid = ? and read = ?",uid,read);
}

 之前的getMail方法,参数只有uid,而uid是一个不变值。所以Mail实体update操作不会改变uid

而getUnReadMails多了一个参数read,Mail实体update是有可能update read从而影响getUnreadMails的缓存,导致不一致(这里的getUnreadMails方法就有可能多出/少一个实体,虽然@CacheUpdate有更新到最新的Mail,但是getUnreadMails的集合会多出这个)

 

解决办法是正确的使用@CacheDelete和@CacheUpdate

例如:上面这个例子应该在update方法上面加上一个@CacheDelete用于移除掉符合条件的实体

 

 

具体的代码因为还缺少同步、测试所以暂时不上传

 

 

 

 

分享到:
评论
4 楼 aa87963014 2015-03-27  
ipconfig1 写道

我现在也遇到这样的问题,当缓存的数据被更新或者删除时,缓存没有做相应的动作。
希望能从你的代码中得到参考,谢谢
我的qq是948945618



可以查看我的  freyja框架 https://github.com/121077313/freyja

net,cache,jdbc
3 楼 aa87963014 2015-03-27  
xcw931924821 写道
楼主现在实现了吗?


可以查看我的  freyja框架 https://github.com/121077313/freyja

net,cache,jdbc
2 楼 xcw931924821 2015-03-19  
楼主现在实现了吗?
1 楼 ipconfig1 2013-03-06  

我现在也遇到这样的问题,当缓存的数据被更新或者删除时,缓存没有做相应的动作。
希望能从你的代码中得到参考,谢谢
我的qq是948945618

相关推荐

Global site tag (gtag.js) - Google Analytics