博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring整合redis
阅读量:4598 次
发布时间:2019-06-09

本文共 3470 字,大约阅读时间需要 11 分钟。

在SSH项目中整合redis

利用spring中的AOP 对redis进行统一的管理

1. 相关Jar文件

下载并导入以下3个Jar文件:

commons-pool2-2.4.2.jar、jedis-2.3.1.jar、spring-data-redis-1.3.4.RELEASE.jar。

三个文件分别对应的下载地址:http://www.java2s.com/Code/JarDownload/spring-data/ ,repo1.maven.org/maven2/redis/clients/jedis/,http://commons.apache.org/proper/commons-pool/download_pool.cgi 

2. Redis配置文件

在src文件夹下面新建一个redis.properties文件,设置连接Redis的一些属性。

 

记住一定要在 spring创建jedisPool的时候,指定参数类型。否则会报错 jedis:Cannot open Redis connection due invalid URI

3. 自定义注解

在src文件夹下面新建一个注解文件;文件内容如下

@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface InterfaceCacheableDao {    String key();    String fieldKey();    int expireTime() default 3600;}

4. 建立AOP通知类

在src文件夹下面新建一个通知类,用于解析注解统一管理redis;

//通知类@Aspectpublic class RedisAdvice {    /**     * 获取注入对象     */    private RedisUtil redisUtil;        public RedisRedisUtil  getRedisUtil () {        return redisUtil;    }        public void setRedisUtil (RedisUtil redisUtil) {        this.redisUtil= redisUtil;    }    @SuppressWarnings("unchecked")    @Around("@annotation(com.samton.common.redis.dao.InterfaceCacheableDao)")    public Object around(ProceedingJoinPoint pjp) throws Throwable {        Object result =null;        InterfaceCacheableDao cacheable=null;        //获取注解上的完整方法        Method proxyMethod = ((MethodSignature)pjp.getSignature()).getMethod();        Method soruceMethod = pjp.getTarget().getClass().getMethod(proxyMethod.getName(), proxyMethod.getParameterTypes());            cacheable=soruceMethod.getAnnotation(com.samton.common.redis.dao.InterfaceCacheableDao.class);                if( null == cacheable ){            cacheable = pjp.getTarget().getClass().getAnnotation(com.samton.common.redis.dao.InterfaceCacheableDao.class);        }        //解析注解        String fieldKey =parseKey(cacheable.fieldKey(),soruceMethod,pjp.getArgs());                //获取方法的返回类型,让缓存可以返回正确的类型        Class returnType=((MethodSignature)pjp.getSignature()).getReturnType();                //使用redis 的hash进行存取,易于管理        result= redisUtil.hget(cacheable.key(), fieldKey,returnType);                if( null == result ){            try {                result=pjp.proceed();                Assert.notNull(fieldKey);                redisUtil.hset(cacheable.key(),fieldKey, result,cacheable.expireTime());            } catch (Throwable e) {                e.printStackTrace();            }        }                return result;    }             /**     *    获取缓存的key      *    key 定义在注解上,支持SPEL表达式     * @param pjp     * @return     */    private String parseKey(String key,Method method,Object [] args){          if(!key.startsWith("#")){            return key;        }        //获取被拦截方法参数名列表和参数 用于匹配spel 表达式的值        LocalVariableTableParameterNameDiscoverer u =               new LocalVariableTableParameterNameDiscoverer();          String [] paraNameArr=u.getParameterNames(method);                //使用SPEL进行key的解析        ExpressionParser parser = new SpelExpressionParser();         //SPEL上下文        StandardEvaluationContext context = new StandardEvaluationContext();        //把方法参数放入SPEL上下文中        for(int i=0;i

4. 测试

在某个方法上面加上注解

@InterfaceCacheableDao(key="channeDao",fieldKey="#channelId",expireTime=20)    public List test(int channelId) {        ......    }

大功告成

转载于:https://www.cnblogs.com/hhwww/p/10795778.html

你可能感兴趣的文章
硬币组合问题
查看>>
(9)模板层 - templates(模板语言、语法、取值、过滤器、变量的使用)
查看>>
P3469 [POI2008]BLO-Blockade
查看>>
P1171 售货员的难题
查看>>
DevOps之持续交付
查看>>
有趣的数学(一)
查看>>
迟来的2013年总结及算法工程师/研究员找工作总结
查看>>
java面向对象中的关键字
查看>>
网络类型IPv4和IPv6什么意思?区别?
查看>>
6周学习计划,攻克JavaScript难关(React/Redux/ES6 etc.)
查看>>
大对象堆及.NET垃圾回收器的改进
查看>>
utf-8引发的页面空白
查看>>
MicroPHP 2.2.0 发布
查看>>
Mysql 语句
查看>>
setState 和 bloc 是仇家
查看>>
jmeter之IP欺骗
查看>>
Ubuntu配置OpenStack 二:配置时间同步NTP和安装数据库Maridb以及问题总结
查看>>
zepto源码--compact、flatten、camelize、dasherize、uniq--学习笔记
查看>>
MyCat:开源分布式数据库中间件
查看>>
递归方法,多维变一维数组
查看>>