java aop redis缓存

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!-- Redis客户端 -->  
  2.         <dependency>  
  3.             <groupId>redis.clients</groupId>  
  4.             <artifactId>jedis</artifactId>  
  5.             <version>2.8.0</version>  
  6.         </dependency>  
  7.   
  8.         <!-- Jackson Json处理工具包 -->  
  9.         <dependency>  
  10.             <groupId>com.fasterxml.jackson.core</groupId>  
  11.             <artifactId>jackson-databind</artifactId>  
  12.             <version>2.7.3</version>  
  13.         </dependency>  



spring 配置文件添加

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!-- 开启切面代理 使得spring认识 @Aspect -->  
  2.    <aop:aspectj-autoproxy/>  

然后定义两个标注在Service实现方法上的注解,用于传递类型参数:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import java.lang.annotation.Documented;  
  2. import java.lang.annotation.ElementType;  
  3. import java.lang.annotation.Retention;  
  4. import java.lang.annotation.RetentionPolicy;  
  5. import java.lang.annotation.Target;  
  6.   
  7. @Retention(RetentionPolicy.RUNTIME)  
  8. @Target(ElementType.METHOD)  
  9. @Documented  
  10. public @interface RedisCache {  
  11.       
  12.     Class type();  
  13.     public int expire() default 0;      //缓存多少秒,默认无限期    
  14. }  


[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import java.lang.annotation.ElementType;  
  2. import java.lang.annotation.Retention;  
  3. import java.lang.annotation.RetentionPolicy;  
  4. import java.lang.annotation.Target;  
  5.   
  6. @Retention(RetentionPolicy.RUNTIME)  
  7. @Target(ElementType.METHOD)  
  8. public @interface RedisEvict {  
  9.     Class type();  
  10. }  

注解的使用方式如下:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @RedisCache(type = User.class, expire = 200000000)  
  2. public List<User> findUsersByGroupId(Integer group_id) {  
  3.     return groupDao.findUsersByGroupId(group_id);  
  4. }  
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @RedisEvict(type = User.class)// 表示该方法需要执行清除缓存逻辑  
  2. public void updateUserByPhone(String nickName,String phone) {  
  3.     UserDao.updateUserByPhone(nickName, phone);  
  4. }  


JsonUtils

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import java.io.IOException;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5. import java.util.Map.Entry;  
  6.   
  7. import org.apache.log4j.Logger;  
  8.   
  9. import com.fasterxml.jackson.core.type.TypeReference;  
  10. import com.fasterxml.jackson.databind.JavaType;  
  11. import com.fasterxml.jackson.databind.ObjectMapper;  
  12.   
  13.   
  14.   
  15. public class JsonUtils {  
  16.   
  17.     private static Logger logger = Logger.getLogger(JsonUtils.class);  
  18.   
  19.     // 定义jackson对象  
  20.     private static final ObjectMapper MAPPER = new ObjectMapper();  
  21.   
  22.     /**  
  23.      * 将对象转换成json字符串。  
  24.      *   
  25.      * @param data  
  26.      * @return  
  27.      * @throws IOException  
  28.      */  
  29.     public static String objectToJson(Object data) {  
  30.         try {  
  31.             String string = MAPPER.writeValueAsString(data);  
  32.             return string;  
  33.         } catch (Exception e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.         return null;  
  37.     }  
  38.   
  39.     /**  
  40.      * 将json结果集转化为对象  
  41.      *   
  42.      * @param jsonData  
  43.      *            json数据  
  44.      * @param clazz  
  45.      *            对象中的object类型  
  46.      * @return  
  47.      */  
  48.     public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {  
  49.         try {  
  50.             T t = MAPPER.readValue(jsonData, beanType);  
  51.             return t;  
  52.         } catch (Exception e) {  
  53.             e.printStackTrace();  
  54.         }  
  55.         return null;  
  56.     }  
  57.   
  58.     /**  
  59.      * 将json数据转换成pojo对象list  
  60.      *   
  61.      * @param jsonData  
  62.      * @param beanType  
  63.      * @return  
  64.      */  
  65.     public static <T> List<T> jsonToList(String jsonData, Class<T> beanType) {  
  66.         JavaType javaType = MAPPER.getTypeFactory().constructParametricType(  
  67.                 List.class, beanType);  
  68.         try {  
  69.             List<T> list = MAPPER.readValue(jsonData, javaType);  
  70.             return list;  
  71.         } catch (Exception e) {  
  72.             e.printStackTrace();  
  73.         }  
  74.   
  75.         return null;  
  76.     }  
  77.   
  78.     /**  
  79.      * json string convert to map with javaBean  
  80.      */  
  81.     public static <T> Map<String, T> jsonTomap(String jsonStr, Class<T> clazz)  
  82.             throws Exception {  
  83.         Map<String, Map<String, Object>> map = MAPPER.readValue(jsonStr,  
  84.                 new TypeReference<Map<String, T>>() {  
  85.                 });  
  86.         Map<String, T> result = new HashMap<String, T>();  
  87.         for (Entry<String, Map<String, Object>> entry : map.entrySet()) {  
  88.             result.put(entry.getKey(), mapTopojo(entry.getValue(), clazz));  
  89.         }  
  90.         return result;  
  91.     }  
  92.   
  93.     /**  
  94.      * json string convert to map  
  95.      */  
  96.     public static <T> Map<String, Object> jsonTomap(String jsonStr) {  
  97.         try {  
  98.             return MAPPER.readValue(jsonStr, Map.class);  
  99.         } catch (Exception e) {  
  100.             // TODO Auto-generated catch block  
  101.             e.printStackTrace();  
  102.         }  
  103.         return null;  
  104.     }  
  105.   
  106.     /**  
  107.      * map convert to javaBean  
  108.      */  
  109.     public static <T> T mapTopojo(Map map, Class<T> clazz) {  
  110.   
  111.         try {  
  112.             return MAPPER.convertValue(map, clazz);  
  113.         } catch (Exception e) {  
  114.             e.printStackTrace();  
  115.         }  
  116.         return null;  
  117.   
  118.     }  
  119.   
  120. }  



AOP的代码如下:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import java.util.List;  
  2.   
  3. import org.aspectj.lang.JoinPoint;  
  4. import org.aspectj.lang.ProceedingJoinPoint;  
  5. import org.aspectj.lang.annotation.Around;  
  6. import org.aspectj.lang.annotation.Aspect;  
  7. import org.aspectj.lang.annotation.Before;  
  8. import org.aspectj.lang.reflect.MethodSignature;  
  9. import org.springframework.beans.factory.annotation.Autowired;  
  10. import org.springframework.stereotype.Component;  
  11.   
  12. import com.core.annotation.RedisCache;  
  13. import com.core.annotation.RedisEvict;  
  14. import com.jedis.dao.JedisClient;  
  15. import com.utils.JsonUtils;  
  16.   
  17. @Aspect  
  18. @Component  
  19. public class CacheInterceptor {  
  20.   
  21.     @Autowired  
  22.     JedisClient jedisClient;  
  23.       
  24.       
  25.     //前置由于数据库数据变更  清理redis缓存  
  26.     @Before("@annotation(redisEvict)")  
  27.     public void <span style="font-family:Consolas, Courier New, Courier, mono, serif;"><span style="line-height: 18px; background-color: rgb(248, 248, 248);">doBefore</span></span>(JoinPoint jp,RedisEvict redisEvict){  
  28.           
  29.           try{  
  30.                 
  31.               String modelName = redisEvict.type().getName();  
  32.               // 清除对应缓存  
  33.               jedisClient.del(modelName);    
  34.                 
  35.           }catch (Exception e) {  
  36.                   
  37.                 e.printStackTrace();  
  38.                 System.out.println("缓存服务器出现问题,发邮箱,发信息...");       
  39.         }  
  40.     }  
  41.   
  42.     // 配置环绕方法  
  43.     @Around("@annotation(redisCache)")  
  44.     public Object doAround(ProceedingJoinPoint pjp, RedisCache redisCache)  
  45.             throws Throwable {  
  46.         // 得到被代理的方法  
  47.         // Method me = ((MethodSignature) pjp.getSignature()).getMethod();  
  48.         // Class modelType = me.getAnnotation(RedisCache.class).type();  
  49.   
  50.         //得到注解上类型  
  51.         Class modelType = redisCache.type();  
  52.         //System.out.println(modelType.getName());  
  53.           
  54.         // 去Redis中看看有没有我们的数据 包名+ 类名 + 方法名 + 参数(多个)  
  55.         String cacheKey = getCacheKey(pjp);  
  56.         System.out.println(cacheKey);  
  57.   
  58.         String value = null;  
  59.           
  60.         try {//当取redis发生异常时,为了不影响程序正常执行,需要try..catch()...  
  61.               
  62.             //检查redis中是否有缓存  
  63.             value = jedisClient.hget(modelType.getName(),cacheKey);  
  64.               
  65.         } catch (Exception e) {  
  66.               
  67.             e.printStackTrace();  
  68.             System.out.println("缓存服务器出现问题,发邮箱,发信息...");  
  69.               
  70.         }  
  71.   
  72.         // result是方法的最终返回结果  
  73.         Object result = null;  
  74.         if (null == value) {  
  75.             // 缓存未命中  
  76.             System.out.println("缓存未命中");  
  77.   
  78.             // 后端查询数据    
  79.             result = pjp.proceed();  
  80.              
  81.             try {//当取redis发生异常时,为了不影响程序正常执行,需要try..catch()...  
  82.                   
  83.                 // 序列化结果放入缓存  
  84.                 String json = serialize(result);  
  85.                 jedisClient.hset(modelType.getName(), cacheKey, json);  
  86.                   
  87.                 if(redisCache.expire()>0) {   
  88.                     jedisClient.expire(cacheKey, redisCache.expire());//设置缓存时间  
  89.                 }  
  90.                   
  91.             } catch (Exception e) {  
  92.                   
  93.                 e.printStackTrace();  
  94.                 System.out.println("缓存服务器出现问题,发邮箱,发信息...");  
  95.             }  
  96.               
  97.         } else {  
  98.               
  99.             try{//当数据转换失败发生异常时,为了不影响程序正常执行,需要try..catch()...  
  100.                   
  101.                 // int i =1/0;  
  102.                   
  103.                 // 得到被代理方法的返回值类型  
  104.                 Class returnType = ((MethodSignature) pjp.getSignature()).getReturnType();  
  105.                   
  106.                 //把json反序列化  
  107.                 result = deserialize(value, returnType, modelType);  
  108.                   
  109.                   
  110.                 // 缓存命中  
  111.                 System.out.println("缓存命中");  
  112.             } catch (Exception e) {  
  113.                   
  114.                 //数据转换失败,到后端查询数据    
  115.                 result = pjp.proceed();  
  116.                   
  117.                 e.printStackTrace();  
  118.                 System.out.println("缓存命中,但数据转换失败...");  
  119.             }  
  120.   
  121.         }  
  122.   
  123.         return result;  
  124.     }  
  125.       
  126.   
  127.     protected String serialize(Object target) {  
  128.         return JsonUtils.objectToJson(target);  
  129.     }  
  130.   
  131.     protected Object deserialize(String jsonString, Class clazz, Class modelType) {  
  132.         // 序列化结果应该是List对象  
  133.         if (clazz.isAssignableFrom(List.class)) {  
  134.             return JsonUtils.jsonToList(jsonString, modelType);  
  135.         }  
  136.   
  137.         // 序列化结果是普通对象  
  138.         return JsonUtils.jsonToPojo(jsonString, clazz);  
  139.     }  
  140.   
  141.       
  142.     // 包名+ 类名 + 方法名 + 参数(多个) 生成Key  
  143.     public String getCacheKey(ProceedingJoinPoint pjp) {  
  144.         StringBuffer key = new StringBuffer();  
  145.         // 包名+ 类名 cn.core.serice.product.ProductServiceImpl.productList  
  146.         String packageName = pjp.getTarget().getClass().getName();  
  147.   
  148.         key.append(packageName);  
  149.         // 方法名  
  150.         String methodName = pjp.getSignature().getName();  
  151.         key.append(".").append(methodName);  
  152.   
  153.         // 参数(多个)  
  154.         Object[] args = pjp.getArgs();  
  155.   
  156.         for (Object arg : args) {  
  157.             // 参数  
  158.             key.append(".").append(arg.toString());  
  159.         }  
  160.   
  161.         return key.toString();  
  162.     }  
  163. }  


jedisClient.java

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public interface JedisClient {  
  2.     String get(String key);  
  3.   
  4.     byte[] get(byte[] key);  
  5.   
  6.     String set(String key, String value);  
  7.   
  8.     String set(byte[] key, byte[] value);  
  9.   
  10.     String hget(String hkey, String key);  
  11.   
  12.     long hset(String hkey, String key, String value);  
  13.   
  14.     long incr(String key);  
  15.   
  16.     long expire(String key, int second);  
  17.   
  18.     long ttl(String key);  
  19.   
  20.     long del(String key);  
  21.   
  22.     long hdel(String hkey, String key);  
  23.       
  24. }  


[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. JedisClientSingle   

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import org.springframework.beans.factory.annotation.Autowired;  
  2.   
  3. import redis.clients.jedis.Jedis;  
  4. import redis.clients.jedis.JedisPool;  
  5.   
  6. import com.edl.jedis.dao.JedisClient;  
  7.   
  8. public class JedisClientSingle implements JedisClient{  
  9.   
  10.     @Autowired  
  11.     private JedisPool jedisPool;   
  12.       
  13.     @Override  
  14.     public String get(String key) {  
  15.         Jedis jedis = jedisPool.getResource();  
  16.         String string = jedis.get(key);  
  17.         jedis.close();  
  18.         return string;  
  19.     }  
  20.   
  21.     @Override  
  22.     public String set(String key, String value) {  
  23.         Jedis jedis = jedisPool.getResource();  
  24.           
  25.         String string = jedis.set(key, value);  
  26.         jedis.close();  
  27.         return string;  
  28.     }  
  29.   
  30.     @Override  
  31.     public String hget(String hkey, String key) {  
  32.         Jedis jedis = jedisPool.getResource();  
  33.         String string = jedis.hget(hkey, key);  
  34.         jedis.close();  
  35.         return string;  
  36.     }  
  37.   
  38.     @Override  
  39.     public long hset(String hkey, String key, String value) {  
  40.         Jedis jedis = jedisPool.getResource();  
  41.         Long result = jedis.hset(hkey, key, value);  
  42.         jedis.close();  
  43.         return result;  
  44.     }  
  45.   
  46.     @Override  
  47.     public long incr(String key) {  
  48.         Jedis jedis = jedisPool.getResource();  
  49.         Long result = jedis.incr(key);  
  50.         jedis.close();  
  51.         return result;  
  52.     }  
  53.   
  54.     @Override  
  55.     public long expire(String key, int second) {  
  56.         Jedis jedis = jedisPool.getResource();  
  57.         Long result = jedis.expire(key, second);  
  58.         jedis.close();  
  59.         return result;  
  60.     }  
  61.   
  62.     @Override  
  63.     public long ttl(String key) {  
  64.         Jedis jedis = jedisPool.getResource();  
  65.         Long result = jedis.ttl(key);  
  66.         jedis.close();  
  67.         return result;  
  68.     }  
  69.   
  70.     @Override  
  71.     public long del(String key) {  
  72.         Jedis jedis = jedisPool.getResource();  
  73.         Long result = jedis.del(key);  
  74.         jedis.close();  
  75.         return result;  
  76.     }  
  77.   
  78.     @Override  
  79.     public long hdel(String hkey, String key) {  
  80.         Jedis jedis = jedisPool.getResource();  
  81.         Long result = jedis.hdel(hkey, key);  
  82.         jedis.close();  
  83.         return result;  
  84.     }  
  85.   
  86.     @Override  
  87.     public byte[] get(byte[] key) {  
  88.         Jedis jedis = jedisPool.getResource();  
  89.         byte[] result = jedis.get(key);  
  90.         jedis.close();  
  91.         return result;  
  92.     }  
  93.   
  94.     @Override  
  95.     public String set(byte[] key, byte[] value) {  
  96.         Jedis jedis = jedisPool.getResource();  
  97.         String result = jedis.set(key, value);  
  98.         jedis.close();  
  99.         return result;  
  100.     }  
  101. }  

JedisClientCluster


[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class JedisClientCluster implements JedisClient {  
  2.   
  3.     @Autowired  
  4.     private JedisCluster jedisCluster;  
  5.       
  6.     @Override  
  7.     public String get(String key) {  
  8.         return jedisCluster.get(key);  
  9.     }  
  10.   
  11.     @Override  
  12.     public String set(String key, String value) {  
  13.         return jedisCluster.set(key, value);  
  14.     }  
  15.   
  16.     @Override  
  17.     public String hget(String hkey, String key) {  
  18.         return jedisCluster.hget(hkey, key);  
  19.     }  
  20.   
  21.     @Override  
  22.     public long hset(String hkey, String key, String value) {  
  23.         return jedisCluster.hset(hkey, key, value);  
  24.     }  
  25.   
  26.     @Override  
  27.     public long incr(String key) {  
  28.         return jedisCluster.incr(key);  
  29.     }  
  30.   
  31.     @Override  
  32.     public long expire(String key, int second) {  
  33.         return jedisCluster.expire(key, second);  
  34.     }  
  35.   
  36.     @Override  
  37.     public long ttl(String key) {  
  38.         return jedisCluster.ttl(key);  
  39.     }  
  40.   
  41.     @Override  
  42.     public long del(String key) {  
  43.           
  44.         return jedisCluster.del(key);  
  45.     }  
  46.   
  47.     @Override  
  48.     public long hdel(String hkey, String key) {  
  49.           
  50.         return jedisCluster.hdel(hkey, key);  
  51.     }  
  52.   
  53.     @Override  
  54.     public byte[] get(byte[] key) {  
  55.         // TODO Auto-generated method stub  
  56.         return jedisCluster.get(key);  
  57.     }  
  58.   
  59.     @Override  
  60.     public String set(byte[] key, byte[] value) {  
  61.         // TODO Auto-generated method stub  
  62.         return jedisCluster.set(key, value);  
  63.     }  
  64.   
  65. }  



spring-jedis.xml
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/mvc   
  7.         http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  8.         http://www.springframework.org/schema/beans  
  9.                     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  10.                     http://www.springframework.org/schema/context  
  11.                     http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  12.                     http://www.springframework.org/schema/aop  
  13.                     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  14.                     http://www.springframework.org/schema/tx  
  15.                     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  16.                     http://www.springframework.org/schema/task  
  17.                     http://www.springframework.org/schema/task/spring-task-3.0.xsd">  
  18.   
  19.      <context:component-scan base-package="com.core" />  
  20.   
  21.   
  22.     <!-- jedis客户端单机版 -->  
  23.     <bean id="redisClient" class="redis.clients.jedis.JedisPool">  
  24.         <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
  25.         <constructor-arg name="port" value="6379"></constructor-arg>  
  26.     </bean>  
  27.     <bean id="jedisClient" class="com.edl.jedis.dao.impl.JedisClientSingle" />  
  28.       
  29.     <!-- jedis集群版配置 -->  
  30. <!--     <bean id="redisClient" class="redis.clients.jedis.JedisCluster">  
  31.         <constructor-arg name="nodes">  
  32.             <set>  
  33.                 <bean class="redis.clients.jedis.HostAndPort">  
  34.                     <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
  35.                     <constructor-arg name="port" value="7006"></constructor-arg>  
  36.                 </bean>  
  37.                 <bean class="redis.clients.jedis.HostAndPort">  
  38.                     <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
  39.                     <constructor-arg name="port" value="7001"></constructor-arg>  
  40.                 </bean>  
  41.                 <bean class="redis.clients.jedis.HostAndPort">  
  42.                     <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
  43.                     <constructor-arg name="port" value="7002"></constructor-arg>  
  44.                 </bean>  
  45.                 <bean class="redis.clients.jedis.HostAndPort">  
  46.                     <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
  47.                     <constructor-arg name="port" value="7003"></constructor-arg>  
  48.                 </bean>  
  49.                 <bean class="redis.clients.jedis.HostAndPort">  
  50.                     <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
  51.                     <constructor-arg name="port" value="7004"></constructor-arg>  
  52.                 </bean>  
  53.                 <bean class="redis.clients.jedis.HostAndPort">  
  54.                     <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
  55.                     <constructor-arg name="port" value="7005"></constructor-arg>  
  56.                 </bean>  
  57.             </set>  
  58.         </constructor-arg>  
  59.         <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>  
  60.     </bean>  
  61.     <bean id="jedisClientCluster" class="com.edl.jedis.dao.impl.JedisClientCluster"></bean> -->  
  62.   
  63. </beans>  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值