java实现透明缓存层

需要用到的jar包

<dependency>
  		<groupId>redis.clients</groupId>
  		<artifactId>jedis</artifactId>
  		<version>2.0.0</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-core</artifactId>
  		<version>4.1.0.RELEASE</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-beans</artifactId>
  		<version>4.1.0.RELEASE</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-context-support</artifactId>
  		<version>4.1.0.RELEASE</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-context</artifactId>
  		<version>4.1.0.RELEASE</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-aop</artifactId>
  		<version>4.1.0.RELEASE</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-tx</artifactId>
  		<version>4.1.0.RELEASE</version>
  	</dependency>
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-jdbc</artifactId>
	    <version>4.1.0.RELEASE</version>
	</dependency>

  	<dependency>
  		<groupId>org.aspectj</groupId>
  		<artifactId>aspectjweaver</artifactId>
  		<version>1.8.6</version>
  	</dependency>
  	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  		<version>4.12</version>
  	</dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.30</version>
    </dependency> 
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.3.0</version>
	</dependency>
	<dependency>
    	<groupId>commons-dbcp</groupId>
    	<artifactId>commons-dbcp</artifactId>
    	<version>1.4</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis-spring</artifactId>
	    <version>1.2.3</version>
	</dependency>
	<dependency>
	    <groupId>log4j</groupId>
	    <artifactId>log4j</artifactId>
	    <version>1.2.17</version>
	</dependency>

ava通过Jedis类库连接操作Redis

<aop:aspectj-autoproxy/>
	<context:annotation-config/>
	<context:component-scan base-package="com.ketai.liudun"/>
	
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxActive" value="20"></property>
		<property name="maxIdle" value="10"></property>
		<property name="maxWait" value="1000"></property>
		<property name="testOnBorrow" value="true"></property>
	</bean>

	<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
		<constructor-arg index="0" ref="jedisPoolConfig" />
		<constructor-arg index="1" value="127.0.0.1" />
		<constructor-arg index="2" value="6379" />
		<!-- timeout -->
		<constructor-arg index="3" value="2000" />
		<!-- password -->
		<constructor-arg index="4" value="IT_training_CZKT_is_Best!" />
	</bean>

	<import resource="spring-mybatis.xml"/>

配置AOP切面

/**
 * 更新的时候添加切入点(update)
 */
@Pointcut("execution(* com.ketai.liudun.service..*Service.update*(com.ketai.liudun.entity.User))")
public void updateCachePointcut(){}



@Around("updateCachePointcut()")
public int updatearound(ProceedingJoinPoint joinPoint){

    //先获取目标方法参数
    User user= null;
    Object[] args = joinPoint.getArgs();
    if (args != null && args.length > 0) {
        user = (User)args[0];
    }

    //得到一个具有唯一性的缓存key
    String redisKey = getRedisKey(joinPoint, user.getUserId().toString());
    log.debug("进入环绕增强前半部分,尝试从redis查询,生成的缓存key:"+redisKey);
    //根据key获取从redis中查询到的对象
    Object data = redisCache.getFromCache(redisKey);
    //如果查询到了执行更新操作
    if(null != data){
        log.debug("["+redisKey+"]】更新:"+data);
        redisCache.save(redisKey,user);
        log.debug("从redis覆盖已存在的数据,并更新到数据库..."+data);
    }
    //没有查到,那么查询数据库
    try {
        joinPoint.proceed();//执行目标方法(service中的update*方法)
    } catch (Throwable e) {
        e.printStackTrace();
        return 0;
    }

    //后置:无

    //将查询到的数据返回
    return 1;
}

Test部分


	@Test
	public void testUpdateUser() {
		User u = userService.findUser(1);//先获取到用户
		u.setUserName("姓名");//修改数据
		int i = userService.updateUser(u);//调用更新,会自动调用AOP配置的透明缓存
		assertNotNull(i);//检测结果
		System.out.println("更新成功"+i);
	}

猜你喜欢

转载自blog.csdn.net/qq_38298396/article/details/82221353