`

使用aop实现系统的缓存策略

阅读更多

通过AOP改善项目中缓存策略

最近项目中要添加memcached来改善系统的访问速度

memcached是个很好用的缓存系统,也很好搭建和维护,这里就不做介绍

下面主要介绍一下怎么来在项目中添加memcached

现在想起来的有两种方式添加

1、在需要添加memcached的方法中都显示的添加和memcached有关的方法

2、使用aop的方式来添加memcached的策略

两个方法的优缺点:

方法一:

优点:直观,明确,让人一下就能看到缓存的存在

缺点:代码编写量比较大。修改起来比较痛苦,比如那一天换缓存的实现方式或者不使用缓存了,需要修改很多方法

方法二:

优点:代码量少,易于维护

缺点:不够直观。并且由于是方法都是以前存在的,也需要修改以前的代码,让他们符合一定的规律,这样才能统一处理

下面主要讲一讲通过AOP方式实现缓存的策略

思路如下:

1aop处理缓存,得区分出来被代理的方法哪些是更新、添加、删除、查询的方法

更新和添加方法的话,直接调用set方法进行更新

删除方法的时候,调用delete方法进行删除

查询方法,查看是否有缓存,如果没有的话,从数据库中查询到,然后添加到缓存中

2、把以前的方法进行分类,那些方法的查询可以继承一个查询父类(该查询父类可以拿到关键的查询条件),那些方法能继承统一的修改父类(修改父类也能拿到关键的查询条件)。其中查询条件作为关键key来存入到缓存中

具体实现可以查看源代码,代码已经上传

主要实现代码如下:

1、CacheUserAop

 针对第一个参数为user对象的操作缓存的aop

写道
package com.wangcanpei.aop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;

import com.wangcanpei.model.User;
import com.wangcanpei.util.MD5;
import com.wangcanpei.util.MemcachedClientUtil;

/**
* 针对第一个参数为user对象的操作缓存的aop
* @author wangcanpei
*
*/
public class CacheUserAop {
private static final Log log=LogFactory.getLog(CacheUserAop.class);


/**
* 在新增数据的时候,调用的aop,作用是往缓存中新增数据
* @param point
* @return
*/
public Object addCacheAfter(JoinPoint point){
Object ret=null;
User user=(User)point.getArgs()[0];
//判断是否添加成功了,如果添加成功,把该值也添加到缓存中
try {
String key=getKey(user);
log.error("key:"+key);
MemcachedClientUtil.set(key, user);
} catch (Throwable e) {
log.error(e);
}
return ret;
}

/**
* 在删除数据的时候,调用的aop,作用是删除缓存里的数据
* @param point
* @return
*/
public Object delCacheAfter(JoinPoint point){
Object ret=null;
User user=(User)point.getArgs()[0];
//判断是否添加成功了,如果添加成功,把该值也添加到缓存中
try {
String key=getKey(user);
log.error("key:"+key);
MemcachedClientUtil.delete(key);
} catch (Throwable e) {
log.error(e);
}
return ret;
}

/**
* 缓存中key的定义规则是:aopTest+参数值,转换成md5
* @param point
* @param user
* @return
*/
private String getKey(User user){
String key="aopTest";
key=key+"&"+user.getName();
return MD5.getMD5(key);
}
}

 2、SelectCacheAop 针对第一个参数为String的查询aop

写道
package com.wangcanpei.aop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import com.wangcanpei.util.MD5;
import com.wangcanpei.util.MemcachedClientUtil;

/**
* 针对第一个参数为String的查询aop
* @author wangcanpei
*
*/
public class SelectCacheAop {
private static final Log log=LogFactory.getLog(SelectCacheAop.class);


/**
* 在查询数据的时候使用,并且第一个参数就是查询条件的
* @param point
* @return
*/
public Object select(ProceedingJoinPoint point){
Object ret=null;
String name=(String)point.getArgs()[0];
//判断是否添加成功了,如果添加成功,把该值也添加到缓存中
try {
String key=getKey(point,name);
log.error("key:"+key);

Object obj=MemcachedClientUtil.get(key);
if(null!=obj){
return obj;
}

return point.proceed();

} catch (Throwable e) {
log.error(e);
}
return ret;
}


/**
* 缓存中key的定义规则是:aopTest+参数值,转换成md5
* @param point
* @param user
* @return
*/
private String getKey(JoinPoint point,String name){
String key="aopTest";
key=key+"&"+name;
return MD5.getMD5(key);
}
}

 配置文件

写道
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
default-autowire="byName">
<bean id="cacheUserAop" class="com.wangcanpei.aop.CacheUserAop" />
<bean id="selectCacheAop" class="com.wangcanpei.aop.SelectCacheAop" />
<aop:config>
<aop:aspect id="TestAspect" ref="cacheUserAop">
<!--配置com.wangcanpei.service包下所有类或接口的所有方法-->
<aop:pointcut id="userAop"
expression="execution(* com.wangcanpei.service.impl.*.*(com.wangcanpei.model.User,..))" />
<aop:after-returning pointcut-ref="userAop" method="addCacheAfter"/>
<aop:pointcut id="deleteuserAop"
expression="execution(* com.wangcanpei.service.impl.*.*(com.wangcanpei.model.User,..))" />
<aop:after-returning pointcut-ref="deleteuserAop" method="delCacheAfter"/>

</aop:aspect>

<aop:aspect id="selectAspect" ref="selectCacheAop">
<!--配置com.wangcanpei.service包下所有类或接口的所有方法-->

<aop:pointcut id="seluserAop"
expression="execution(* com.wangcanpei.service.impl.*.*(String,..))" />
<aop:around pointcut-ref="seluserAop" method="select"/>

</aop:aspect>
</aop:config>



</beans>

 

 

分享到:
评论

相关推荐

    低清版 大型门户网站是这样炼成的.pdf

    6.2.8 基于annotation方式的aop实现 391 6.3 spring 2.5事务管理机制 393 6.3.1 spring 2.5的声明式事务管理 394 6.3.2 基于xml方式的事务管理配置 396 6.3.3 基于annotation方式的事务管理配置 400 6.4 “桃园...

    asp.net知识库

    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...

    Java Web程序设计教程

    程序设计教程.pdf&gt;&gt;人民邮电出版社的教程哦,所以,好书,你懂的!...15.4.4系统管理实现 313 15.4.5图书管理实现 319 15.4.6读者管理实现 329 15.4.7借还管理实现 333 15.4.8前台功能实现 336 本章小结 342

    JiveJdon v4.6.1.zip

    JiveJdon 不只是一个论坛程序,它的Message模型可以重用在网站内容系统、新闻发布系统、电子商务系统、仓库管理系统、资源管理系统等跨域范围中(部分已经实现),实现了目前重用研究领域最高级别的静态重用:业务...

    Spring面试题

    4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入...

    xmljava系统源码-phone:这只是一套简化开发的框架,主要技术使用Mybatis+Spring+SpringMVC+shiro,全局鉴

    使用redis作为缓存 使用poi导出excel 项目亮点: 严格的权限控制,当然你也可以自己扩展.. 采用redis作为主键生成策略,无序考虑主键策略,且通用性相当不错.-- AOP加注解方式记录日志,日志内容清晰,记录方式简单.-- ...

    积分管理系统java源码-knowledge:这是我的知识,包括我所有已知的

    积分管理系统java源码 ...缓存使用场景及选择策略 Spring集成下的SqlSession和Mapper Mybatis的事务 分析Mybatis动态代理的真正实现 手动实现Mini版本的Mybatis 分布式 分布式原理 分布式架构的演进过

    egg-cms-stu:蛋-cms-stu

    EGG-CMS-RBAC 系统演示地址实现一个 RBAC 系统首先要认识 egg 主要看下 目录结构和加载器框架模块 异步 async/await 开发; 接入 ORM 组件 ——Sequelize (Mongoose、Sequelize、TypeORM),封装数据库操作; 支持...

    达内java培训目录

    熟练掌握SpringIoc及AOP实现方式;熟练掌握Spring事务管理;熟练掌握Spring与其他组件的整合技术。• 实训项目五:企业级应用"航空订票"系统开发 1.开班前 5天训练营将完成"捕鱼达人"游戏项目 2.开班 2周内,...

    java8源码-springboot:《SpringBoot整合各项功能的学习记录》欢迎大家指正!有收获的朋友,可以关注【start】会持续更

    监控端点、策略模式实现 springboot-aop 基于url的幂等方案、幂等方案总结 springboot-api-mideng 基于注解+拦截+TOKEN的幂等方案 springboot-api-ui springboot使用Knife4j代替swagger做接口文档 springboot-async ...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    框架实现 log4j logback commong logging jdk logger 测试框架 测试框架 junit easymock testng mockito bug管理 禅道 jira 开发工具 编程工具 eclipse myeclipse idea vi VS webstorm ...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics