之前自己写过一个通过注解和AOP来实现缓存的代码,最早的原型来自于在淘宝工作时的一个项目。当时这段代码写得比较差,之后重构时发现之前的功能实现有很大的局限。主要问题在于:
- key的生成规则
- update 与 query 的参数不一样,如何让其生成一样的key
- 列表缓存如何定义key及失效
最近同事推荐了一个开源项目:Simple-Spring-Memcached(简称ssm),它也是一个通过Annatation与AOP来完成缓存数据操作的开源项目。仔细看了一下代码,基本上把我之前碰到的问题都解决了,而且MultiCache这一块的实现超出我的预期。该项目主要优点如下:
- 与Spring完善集成
- 支持两种Memcached Java Client (spymemcached,Xmemcached)
- 基于Annotation方式实现缓存操作,对代码侵入性小
- annotation丰富,可以满足绝大部分需求
下面介绍一下其中各annotation的使用。ssm项目中的Annotation主要分成以下几类
- SingleCache类 操作单个POJO的Cache数据,由ParameterValueKeyProvider和CacheKeyMethod来标识组装key
- MultiCache类 操作List型的Cache数据,由ParameterValueKeyProvider和CacheKeyMethod来标识组装key
- AssignCache类 指定key操作Cache数据,由annotation中的 assignedKey 指定key
各Annotation的详细说明
- ReadThroughSingleCache
作用:读取Cache中数据,如果不存在,则将读取的数据存入Cache
key生成规则:ParameterValueKeyProvider指定的参数,如果该参数对象中包含CacheKeyMethod注解的方法,则调用其方法,否则调用toString方法
代码示例:
@ReadThroughSingleCache(namespace = "Alpha", expiration = 30)
public String getDateString(@ParameterValueKeyProvider final String key) {
final Date now = new Date();
try {
Thread.sleep(1500);
} catch (InterruptedException ex) {
}
return now.toString() + ":" + now.getTime();
}
- InvalidateSingleCache
作用:失效Cache中的数据
key生成规则:
- 使用 ParameterValueKeyProvider注解时,与ReadThroughSingleCache一致
- 使用 ReturnValueKeyProvider 注解时,key为返回的对象的CacheKeyMethod或toString方法生成
@InvalidateSingleCache(namespace = "Charlie")
public void updateRandomString(@ParameterValueKeyProvider final Long key) {
// Nothing really to do here.
}
@InvalidateSingleCache(namespace = "Charlie")
@ReturnValueKeyProvider
public Long updateRandomStringAgain(final Long key) {
return key;
}
- UpdateSingleCache
作用:更新Cache中的数据
key生成规则:ParameterValueKeyProvider指定
ParameterDataUpdateContent:方法参数中的数据,作为更新缓存的数据
ReturnDataUpdateContent:方法调用后生成的数据,作为更新缓存的数据
注:上述两个注解,必须与Update*系列的注解一起使用
@UpdateSingleCache(namespace = "Alpha", expiration = 30)
public void overrideDateString(final int trash, @ParameterValueKeyProvider final String key,
@ParameterDataUpdateContent final String overrideData) {
}
@UpdateSingleCache(namespace = "Bravo", expiration = 300)
@ReturnDataUpdateContent
public String updateTimestampValue(@ParameterValueKeyProvider final Long key) {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
final Long now = new Date().getTime();
final String result = now.toString() + "-U-" + key.toString();
return result;
}
- ReadThroughAssignCache
作用:读取Cache中数据,如果不存在,则将读取的数据存入Cache
key生成规则: ReadThroughAssignCache 注解中的 assignedKey 字段指定
@ReadThroughAssignCache(assignedKey = "SomePhatKey", namespace = "Echo", expiration = 3000)
public List<String> getAssignStrings() {
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
}
final List<String> results = new ArrayList<String>();
final long extra = System.currentTimeMillis() % 20;
final String base = System.currentTimeMillis() + "";
for (int ix = 0; ix < 20 + extra; ix++) {
results.add(ix + "-" + base);
}
return results;
}
- InvalidateAssignCache
作用:失效缓存中指定key的数据
key生成规则:assignedKey 字段指定
@InvalidateAssignCache(assignedKey = "SomePhatKey", namespace = "Echo")
public void invalidateAssignStrings() {
}
- UpdateAssignCache
作用:更新指定缓存
key生成规则:assignedKey 字段指定
分享到:
相关推荐
SSM整合了memcached的高速缓存机制,包含注释jar包,运行无bug!
该文档主要整理的是SSM的常见面试题,包括一下内容: 1. SpringMVC 的工作原理 (11步) 2. 谈谈你对SpringMVC的理解 3. SpringMVC 常用注解都有哪些? 4. Spring 的常用注解 5. 如何开启注解处理器和适配器? 6...
2:成功整合了redis,并在项目中使用了redis的注解缓存功能,主要配置了商品类的缓存,并且当更新商品状态时清空缓存重新在数据库中查询后再存入缓存; 搭建了Linux环境,利用docker安装好了elasticsearch,同时在项目test...
基于SSM框架,通过spring注解的方式,实现redis的数据缓存机制,将mysql的数据缓存到redis数据库.zip
07、关于数据库链接,可以使用手工获取的方式(代码表加载的例子),也可以使用框架封装的方式(日志保存的例子); 08、开发环境jdk1.8,tomcat8 09、有些功能参考了网上的帖子或源码,在此表示感谢; 10、框架可...
因为学习这个系统可以巩固自己的SSM技术,简单易懂,没有什么复杂的逻辑操作和算法, 因为这是一个简单的个人博客,所以功能没那么多,自己如果想要添加更多的功能可以继续添加, 比葫芦画瓢,上手会非常快,这个...
权限管理系统 shiro + ssm实现,实现菜单,有学习的可以下载哦!...项目也整合了redis做缓存,把pom.xml中<artifactId>spring-boot-starter-data-redis和com.xe.demo.common.support.redis包下的注释去掉,
Java 权限管理系统 shiro + ssm实现。 权限管理系统 shiro + ssm...项目也整合了redis做缓存,把pom.xml中<artifactId>spring-boot-starter-data-redis</artifactId> 和com.xe.demo.common.support.redis包下的注释去掉,
此案例是利用Maven工程实现了SSM 整合Shiro安全框架,实现了登录身份认证功能及权限管理功能,用到了Shiro的缓存效果。注释比较完善,但是没有打包数据库文件。
本项目针对初学spring、springmvc、mybatis、框架者,配置勒redis缓存,项目内都有详细的注解声明。!!!!!!!!!
07、关于数据库链接,可以使用手工获取的方式(代码表加载的例子),也可以使用框架封装的方式(日志保存的例子); 08、开发环境jdk1.6,tomcat7,初始登录用户名:wu_dh 密码:1 09、有些功能参考了网上的帖子或...
基于Spring+SpringMVC+Mybatis实现简单的个人博客系统,这个系统适合刚毕业或者在校学习的计算机专业的同学学习,因为学习这个系统可以巩固自己的SSM技术,简单易懂,没有什么复杂的逻辑操作和算法,因为这是一个...
07、关于数据库链接,可以使用手工获取的方式(代码表加载的例子),也可以使用框架封装的方式(日志保存的例子); 08、开发环境jdk1.6,tomcat6 09、有些功能参考了网上的帖子或源码,在此表示感谢; 10、框架...
里面本人亲测shiro 和ssm整合 开发工具为myeclipse jdk1.7 tomcat7 ,是一个实战的项目,注释也很清楚。大家可以看看,新手也可以参考一下。shiro的认证 授权 记住我 和ehcache 缓存都结合的很清楚。
我还负责了redis集成spring并缓存树 redis的使用主要涉及到两个注解的使用 1.Cache able:将方法的返回值在集合中查询出来之后缓存在redis中,之后的查询就不走数据库了 直接从redis中查询 2.CacheEvict:根据key...
4.已经集成的Redis缓存,基于jedis使用缓存,实现客户端分片。 5.添加CommonInterceptor类实现HandlerInterceptorAdapter接口拦截请求,基于注解添加RedisAspect拦截类监视缓存方法调用。 6.集成office文件操作插件...
ssm+shiro+redis+ecache整合认证权限,里面有配置了两套缓存,redis,和ecache,由于redis缓存频繁读取session,现在改成了本地缓存,ecache,速度有所提升,如果用于生产环境建议改成redis,替换成redis,值需要替换...
权限管理系统 shiro + ssm实现,实现菜单,有学习的可以下载哦!...项目也整合了redis做缓存,把pom.xml中<artifactId>spring-boot-starter-data-redis和com.xe.demo.common.support.redis包下的注释去掉,
源码部分包含了项目的主要代码文件,包括前端Vue.js代码、后端SSM框架代码以及数据库操作代码。这些代码文件经过了详细的注释,方便开发者理解和修改。部署说明部分提供了如何将项目部署到服务器上的详细步骤,包括...