Spring Cache+Redis实现自定义注解缓存

pom中引入


org.springframework.data
spring-data-redis
1.6.1.RELEASE


redis.clients
jedis
2.8.0



在spring-redis.xml 中加入

以及

	
		
		
		
	
	
		
		
			
		
		
		
			
		
	 
	
	
		
		
		
			
				actor
				user
				account
				common
			
		
        
		
        
		
			
				
			
		
        
		
		
		
			
				
				
			
		
	
	
	

使用自定义注解完成全限定类名+方法名+参数的key生成规则

package com.youyuTech.oneTalkOnline.myAnnotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.cache.annotation.Cacheable;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Cacheable(key = "targetClass+':'+methodName+':'+args")
public @interface MyCacheable {

}

在service中的配置

package com.youyuTech.oneTalkOnline.services.impl;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.RandomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.stereotype.Service;

import redis.clients.jedis.Tuple;

import com.youyuTech.oneTalkOnline.constant.RedisKeyConstant;
import com.youyuTech.oneTalkOnline.dao.ActorMapper;
import com.youyuTech.oneTalkOnline.model.Actor;
import com.youyuTech.oneTalkOnline.model.User;
import com.youyuTech.oneTalkOnline.model.dto.ActorAndUser;
import com.youyuTech.oneTalkOnline.model.dto.ActorDto;
import com.youyuTech.oneTalkOnline.myAnnotation.MyCacheable;
import com.youyuTech.oneTalkOnline.services.IActorService;
import com.youyuTech.oneTalkOnline.services.IUserService;

@Service
@CacheConfig(cacheNames = "actor")
// 确定命名空间
public class ActorServiceImpl implements IActorService {

	private static Logger logger = LoggerFactory.getLogger(ActorServiceImpl.class);

	@Resource
	private ActorMapper actorMapper;
	@Resource
	private IUserService userServiceImpl;
	@Autowired
	private RedisServiceImpl redisService;

	

	// targetClass+methodName+args 类名全限定+方法名+参数
	@MyCacheable
	public ActorDto loadActorSimpleData(String aid) throws UnsupportedEncodingException {
		if (StringUtils.isBlank(aid)) {
			throw new NullPointerException("aid should not be null. ");
		}

		ActorDto aau = new ActorDto();

		List actorids = new ArrayList();
		actorids.add(aid);
		List actors = queryActorList(actorids);
		Actor actor = actors.isEmpty() ? null : actors.get(0);
		User user = userServiceImpl.queryUsersBasicInfo(aid);
		if (user != null) {
			BeanUtils.copyProperties(user, aau);
		}
		if (actor != null) {
			BeanUtils.copyProperties(actor, aau);
		}

		return aau;
	}

	

}

root对象的使用

       除了上述使用方法参数作为key之外,Spring还为我们提供了一个root对象可以用来生成key。通过该root对象我们可以获取到以下信息。

属性名称

描述

示例

methodName

当前方法名

#root.methodName

method

当前方法

#root.method.name

target

当前被调用的对象

#root.target

targetClass

当前被调用的对象的class

#root.targetClass

args

当前方法参数组成的数组

#root.args[0]

caches

当前被调用的方法使用的Cache

#root.caches[0].name

 

       当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。如:

   @Cacheable(value={ "users""xxx"}, key="caches[1].name")

   public User find(User user) {

      returnnull;

   }



你可能感兴趣的:(JAVA,spring,redis,cache)