redisとspringの完全な統合

6909 ワード


spring-data-redisをダウンロードし、gavは以下の通りです.
                  
			org.springframework.data
			spring-data-redis
			1.0.1.RELEASE
			
				
					org.slf4j
					slf4j-log4j12
				
				
					org.slf4j
					jcl-over-slf4j
				
			

		

プロジェクト内の他のパッケージと競合するため、exclusionには2つのパッケージがあります.
beanは以下のように構成する、web.xmlでbeanファイルのロードを構成するには:
	
		
	
	
	  
		  
		  
		  
		  
	  
	
	  
		  
		  
		
	
	  
		  
		  
		
	
	  
		  
		
			
				
				
			
		  
	
	
	
		  
		  
		 
	
		
	 
     
	 
	
        

 
プロパティ・ファイルの内容は次のとおりです.
redis.ip=192.168.1.110
redis2.ip=192.168.1.112
#Port   
redis.port=6379

#         
redis.pool.maxActive=1024
#      idel      
redis.pool.maxIdle=200
#          ,      
redis.pool.maxWait=1000
#   borrow Object   ,          
redis.pool.testOnBorrow=true
#   return Object   ,            
redis.pool.testOnReturn=true

キャッシュ管理インタフェース:
public interface RedisCache {
	
	public  T getRedisCacheInfo(String key);

	public  boolean setRedisCacheInfo(String key, T value);
	
}

キャッシュ管理の実装:
public class RedisCacheManger implements RedisCache {
	
	private ShardedJedisPool pool ;
	
	private Logger log = Logger.getLogger(RedisCacheManger.class); 
	public ShardedJedisPool getPool() {
		return pool;
	}

	public void setPool(ShardedJedisPool pool) {
		this.pool = pool;
	}

	public  T getRedisCacheInfo(String key) {
		
		try {
			log.info("get from redisCache :"+key);
			System.out.println("get from rediscache");
			ShardedJedis jedis = pool.getResource();
			pool.returnResource(jedis);
			return (T)jedis.get(key);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
 

	public  boolean setRedisCacheInfo(String key, T value) {

		try {
			log.info("add to redisCache :"+key);
			System.out.println("add to rediscache");
			ShardedJedis jedis = pool.getResource();
			jedis.set(key, (String)value);
			pool.returnResource(jedis);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	public static void main(String[] args) {
		new RedisCacheManger().setRedisCacheInfo("12345", "asdfg");
	}
}

キャッシュ断面注記:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NeedRedisCached {}

キャッシュ断面処理クラス:
@Aspect
public class RedisCacheAspect implements Ordered {
	
	private static Logger log = Logger.getLogger(RedisCacheAspect.class); 
	private RedisCache redisCacheManager;
	private int orderValue = 3;
	public RedisCache getRedisCacheManager() {
		return redisCacheManager;
	}

	public void setRedisCacheManager(RedisCache redisCacheManager) {
		this.redisCacheManager = redisCacheManager;
	}

	@Pointcut("@annotation(com.jd.bi.odp.common.cache.core.NeedRedisCached)")
	public void needRedisCached() {

	}
	
	@Around("needRedisCached() && args(filter,..)")
	public Object aroundInvoke(ProceedingJoinPoint pjp, QueryFilter filter) throws Throwable {
		log.info("enter aroundInvoke!!!");
		if (filter.getValue() == null) {
			return null;
		}

		boolean cacheEnabled = CommonUtil.parseBoolean(HBaseConfig.getProperty("redisCache.enabled"), false);

		if (cacheEnabled) {
			
			String md5key = MD5Util.getMD5(filter.getValue().toString());
			Object value = redisCacheManager.getRedisCacheInfo(md5key);
			boolean flag = false;
			if (null != value) {

				JSONObject json = new JSONObject(value.toString());
				return json;
			} else if ("null".equals(value)) {
				return null;
			} else { //  hbase  
				value = pjp.proceed();
				if(null!=value){//                
					}
					else{
						flag = redisCacheManager.setRedisCacheInfo(md5key, value.toString());
						
						if(flag)
							log.info("add a cache success by key: "+md5key);
						else
							log.warn("add a cache failure by key: "+md5key);
					}
				}
				return value;
			}
		} else {//   hbase  
			return pjp.proceed();
		}
	}
	@Override
	public int getOrder() {
		return orderValue;
	}
	public int getOrderValue() {
		return orderValue;
	}

	public void setOrderValue(int orderValue) {
		this.orderValue = orderValue;
	}
}

キャッシュが存在する場合は直接戻り、存在しない場合はデータソースクエリーを実行します.ここではhbaseクエリーで、キャッシュを設定します.
 
切断面の設定:
	
	
		
		
	
	
	
		
	
	

このとき,フロントエンドウェブページユーザのアクセストリガのactionが条件を満たすと,接面メソッド処理に入りredisキャッシュの使用を完了する.