在springmvc中配置jedis(转)

 

主要学习https://github.com/thinkgem/jeesite。一下代码均参考于此并稍作修改。

1.jedis

首先,需要添加jedis:

<!--jedis-->
<dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.8.0</version>
</dependency>

2.applicationContext-jedis.xml

然后,springmvc完成基本配置。添加jedispool的bean即可。在spring容器中添加applicationContext-jedis.xml:

在applicationContext-jedis.xml中添加:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    <!-- 加载配置属性文件 -->
    <context:property-placeholder ignore-unresolvable="true" location="classpath:db.properties" />

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="300"/> <!--最大能够保持idel状态的对象数-->
        <property name="maxTotal" value="60000"/><!--最大分配的对象数-->
        <property name="testOnBorrow" value="true"/><!--当调用borrow Oject方法时,是否进行有效性检查-->
    </bean>

    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
        <constructor-arg index="0" ref="jedisPoolConfig"/>
        <constructor-arg index="1" value="${redis.host}"/>
        <constructor-arg index="2" value="${redis.port}" type="int"/>
        <constructor-arg index="3" value="${redis.timeout}" type="int"/>
        <constructor-arg index="4" value="${redis.auth}"/>
    </bean>
</beans>

注解:参考的源码中的jedisPool配置只有三个参数:config,host,port。我复制后的结果总是getResource失败,因为我的redis添加了auth,所以猜测是不是没通过auth的原因。于是打开JedisPool的源码:

  1 package redis.clients.jedis;
  2
  3 import java.net.URI;
  4
  5 import org.apache.commons.pool2.impl.GenericObjectPool;
  6 import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
  7
  8 import redis.clients.jedis.exceptions.JedisException;
  9 import redis.clients.util.JedisURIHelper;
 10 import redis.clients.util.Pool;
 11
 12 public class JedisPool extends Pool<Jedis> {
 13
 14   public JedisPool() {
 15     this(Protocol.DEFAULT_HOST, Protocol.DEFAULT_PORT);
 16   }
 17
 18   public JedisPool(final GenericObjectPoolConfig poolConfig, final String host) {
 19     this(poolConfig, host, Protocol.DEFAULT_PORT, Protocol.DEFAULT_TIMEOUT, null,
 20         Protocol.DEFAULT_DATABASE, null);
 21   }
 22
 23   public JedisPool(String host, int port) {
 24     this(new GenericObjectPoolConfig(), host, port, Protocol.DEFAULT_TIMEOUT, null,
 25         Protocol.DEFAULT_DATABASE, null);
 26   }
 27
 28   public JedisPool(final String host) {
 29     URI uri = URI.create(host);
 30     if (JedisURIHelper.isValid(uri)) {
 31       String h = uri.getHost();
 32       int port = uri.getPort();
 33       String password = JedisURIHelper.getPassword(uri);
 34       int database = JedisURIHelper.getDBIndex(uri);
 35       this.internalPool = new GenericObjectPool<Jedis>(new JedisFactory(h, port,
 36           Protocol.DEFAULT_TIMEOUT, Protocol.DEFAULT_TIMEOUT, password, database, null),
 37           new GenericObjectPoolConfig());
 38     } else {
 39       this.internalPool = new GenericObjectPool<Jedis>(new JedisFactory(host,
 40           Protocol.DEFAULT_PORT, Protocol.DEFAULT_TIMEOUT, Protocol.DEFAULT_TIMEOUT, null,
 41           Protocol.DEFAULT_DATABASE, null), new GenericObjectPoolConfig());
 42     }
 43   }
 44
 45   public JedisPool(final URI uri) {
 46     this(new GenericObjectPoolConfig(), uri, Protocol.DEFAULT_TIMEOUT);
 47   }
 48
 49   public JedisPool(final URI uri, final int timeout) {
 50     this(new GenericObjectPoolConfig(), uri, timeout);
 51   }
 52
 53   public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, int port,
 54       int timeout, final String password) {
 55     this(poolConfig, host, port, timeout, password, Protocol.DEFAULT_DATABASE, null);
 56   }
 57
 58   public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, final int port) {
 59     this(poolConfig, host, port, Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE, null);
 60   }
 61
 62   public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, final int port,
 63       final int timeout) {
 64     this(poolConfig, host, port, timeout, null, Protocol.DEFAULT_DATABASE, null);
 65   }
 66
 67   public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, int port,
 68       int timeout, final String password, final int database) {
 69     this(poolConfig, host, port, timeout, password, database, null);
 70   }
 71
 72   public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, int port,
 73       int timeout, final String password, final int database, final String clientName) {
 74     this(poolConfig, host, port, timeout, timeout, password, database, clientName);
 75   }
 76
 77   public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, int port,
 78       final int connectionTimeout, final int soTimeout, final String password, final int database,
 79       final String clientName) {
 80     super(poolConfig, new JedisFactory(host, port, connectionTimeout, soTimeout, password,
 81         database, clientName));
 82   }
 83
 84   public JedisPool(final GenericObjectPoolConfig poolConfig, final URI uri) {
 85     this(poolConfig, uri, Protocol.DEFAULT_TIMEOUT);
 86   }
 87
 88   public JedisPool(final GenericObjectPoolConfig poolConfig, final URI uri, final int timeout) {
 89     this(poolConfig, uri, timeout, timeout);
 90   }
 91
 92   public JedisPool(final GenericObjectPoolConfig poolConfig, final URI uri,
 93       final int connectionTimeout, final int soTimeout) {
 94     super(poolConfig, new JedisFactory(uri, connectionTimeout, soTimeout, null));
 95   }
 96
 97   @Override
 98   public Jedis getResource() {
 99     Jedis jedis = super.getResource();
100     jedis.setDataSource(this);
101     return jedis;
102   }
103
104   /**
105    * @deprecated starting from Jedis 3.0 this method will not be exposed.
106    * Resource cleanup should be done using @see {@link redis.clients.jedis.Jedis#close()}
107    */
108   @Override
109   @Deprecated
110   public void returnBrokenResource(final Jedis resource) {
111     if (resource != null) {
112       returnBrokenResourceObject(resource);
113     }
114   }
115
116   /**
117    * @deprecated starting from Jedis 3.0 this method will not be exposed.
118    * Resource cleanup should be done using @see {@link redis.clients.jedis.Jedis#close()}
119    */
120   @Override
121   @Deprecated
122   public void returnResource(final Jedis resource) {
123     if (resource != null) {
124       try {
125         resource.resetState();
126         returnResourceObject(resource);
127       } catch (Exception e) {
128         returnBrokenResource(resource);
129         throw new JedisException("Could not return the resource to the pool", e);
130       }
131     }
132   }
133 }

View Code

看到有password的参数配置,如果没有配置的话默认为null。到这一步我便没有往下深入看了,因为我连接的redis中有auth,原谅我的不求甚解。于是,我接着配置timeout和auth。timeout直接还是源码的默认值。后面的代码测试通过。在这里我了解到spring的bean注入的几个参数含义:比如property表示属性注入,constructor表示构造函数的参数注入。

3. JedisUtil

3.1 getResource

上面设置好了JedisPool,这里就要获取jedis。然后就可以利用jedis进行操作了。

 1  /**
 2      * 获取资源
 3      * @return
 4      */
 5     public static Jedis getResource() {
 6         Jedis jedis = null;
 7         try {
 8             jedis = jedisPool.getResource();
 9             logger.debug("getResource:{}",jedis);
10         } catch (Exception e) {
11             logger.error("getResource:{}",e);
12             if (jedis!=null)
13             jedis.close();
14             throw  e;
15         }
16         return jedis;
17     }

3.2 Object对象的缓存

通过使用jedis基本可以完成任何操作了。这里添加一个缓存对象的功能。java对象的缓存利用序列化实现,因此,需要缓存的对象必须实现了serializable接口。关于如何序列化,参考:将对象序列化和反序列化

 1   /**
 2      * 设置缓存
 3      * @param key String
 4      * @param value Object对象
 5      * @param cacheSeconds 超时时间,0为不超时
 6      * @return
 7      */
 8     public static String setObject(String key,Object value,int cacheSeconds){
 9         String result = null;
10         Jedis jedis = null;
11         try {
12             jedis = getResource();
13             result = jedis.set(getBytesKey(key),toBytes(value));
14             if (cacheSeconds!=0){
15                 jedis.expire(key,cacheSeconds);
16             }
17             logger.debug("setObject {}={}",key,value);
18         } catch (Exception e) {
19             logger.warn("setObject {}  失败:{}",key,e);
20         } finally {
21             jedis.close();
22         }
23         return result;
24     }
25 /**
26      * 获取缓存
27      * @param key
28      * @return 对象(反序列化)
29      */
30     public static Object getObject(String key){
31         Object value = null;
32         Jedis jedis = null;
33         try {
34             jedis = getResource();
35             byte[] bytes = jedis.get(getBytesKey(key));
36             value =  toObject(bytes);
37             logger.debug("getObject {}={}",key,value);
38         } catch (Exception e) {
39             logger.warn("getObject {}错误:{}",key,e.getMessage());
40             e.printStackTrace();
41         } finally {
42             jedis.close();
43         }
44         return value;
45     }
46  /**
47      * 将key转换为byte[]
48      * @param object
49      * @return
50      */
51     private static byte[] getBytesKey(Object object) {
52         if(object instanceof String){
53             return StringUtils.getBytes((String) object);
54         }else {
55             return ObjectUtils.serialize(object);
56         }
57     }
58
59     /**
60      * Object转换为byte[]类型
61      * @param value Object对象
62      * @return byte[]数组
63      */
64     private static byte[] toBytes(Object value) {
65         return ObjectUtils.serialize(value);
66     }
67
68     /**
69      * byte[]转换为object
70      * @param bytes
71      * @return
72      */
73     private static Object toObject(byte[] bytes) {
74         return ObjectUtils.unserialize(bytes);
75     }

3.3 ObjectList对象缓存

我们平时用到的list基本都是ObjectList,即list的元素为object而不是String。这样就需要特定方法来缓存了。

采用同样的方式,将object序列化为字节数组,然后存储起来。取出的时候再反序列化,因此object必须实现了serializable接口,而且static的成员不能序列化或者说序列化的结果为默认值。原因参考:将对象序列化和反序列化

  1 /**
  2      * 获取list缓存
  3      * @param key
  4      * @return
  5      */
  6     public static List<String> getList(String key){
  7         key = addDatabaseName(key);
  8         List<String> value = null;
  9         Jedis jedis = null;
 10         try {
 11             jedis = getResource();
 12             value = jedis.lrange(key, 0, -1);
 13             logger.debug("getList {}={}",key,value);
 14         } catch (Exception e) {
 15             logger.warn("getList {}失败:{}",key,e);
 16             e.printStackTrace();
 17         } finally {
 18             jedis.close();
 19         }
 20         return value;
 21     }
 22
 23     /**
 24      * 获取list缓存,元素是object
 25      * @param key
 26      * @return
 27      */
 28     public static List<Object> getObjectList(String key){
 29         key = addDatabaseName(key);
 30         List<Object> value = null;
 31         Jedis jedis = null;
 32         try {
 33             jedis = getResource();
 34             List<byte[]> list = jedis.lrange(getBytesKey(key), 0, -1);
 35             value = Lists.newArrayList();
 36             for (byte[] bytes : list) {
 37                 value.add(toObject(bytes));
 38             }
 39             logger.debug("getObjectList {}={}",key,value);
 40         }catch (Exception e){
 41             logger.warn("getObjectList {} 失败:{}",key,e);
 42             e.printStackTrace();
 43         }finally {
 44             jedis.close();
 45         }
 46         return value;
 47     }
 48
 49     /**
 50      * 设置list缓存
 51      * @param key
 52      * @param value
 53      * @param cacheSeconds
 54      * @return
 55      */
 56     public static long setList(String key,List<String> value,int cacheSeconds){
 57         key = addDatabaseName(key);
 58         long result = 0;
 59         Jedis jedis = null;
 60         try {
 61             jedis = getResource();
 62             jedis.del(key);
 63             String[] arr = new String[value.size()];
 64             value.toArray(arr);
 65             result = jedis.rpush(key,arr);
 66             if (cacheSeconds!=0){
 67                 jedis.expire(key,cacheSeconds);
 68             }
 69             logger.debug("setList {}={}",key,value);
 70         }catch (Exception e){
 71             logger.warn("setList {} 错误:",key,e);
 72             e.printStackTrace();
 73         }finally {
 74             jedis.close();
 75         }
 76         return result;
 77     }
 78
 79     /**
 80      * 设置list缓存,list的元素为object
 81      * @param key
 82      * @param value
 83      * @param cacheSeconds
 84      * @return
 85      */
 86     public static long setObjectList(String key,List<Object> value ,int cacheSeconds){
 87         key = addDatabaseName(key);
 88         long result = 0;
 89         Jedis jedis = null;
 90         try {
 91             jedis = getResource();
 92             jedis.del(key);
 93             ArrayList<byte[]> list = Lists.newArrayList();
 94             for (Object o : value) {
 95                 list.add(toBytes(o));
 96             }
 97             byte[] []arr = new byte[list.size()][];
 98             list.toArray(arr);
 99             result = jedis.rpush(getBytesKey(key),arr);
100             if(cacheSeconds!=0){
101                 jedis.expire(key,cacheSeconds);
102             }
103             logger.debug("setObjectList {}={}",key,value);
104         }catch (Exception e){
105             logger.warn("setObjectList {} 错误:{}",key,e);
106             e.printStackTrace();
107         }
108         return result;
109     }

View Code

 

So do it,and change it,no regret!

http://www.cnblogs.com/woshimrf/p/5211253.html

时间: 2024-12-12 21:14:49

在springmvc中配置jedis(转)的相关文章

配置-SpringMVC中怎么将@ResponseBody返回Json数据在log4j中输出

问题描述 SpringMVC中怎么将@ResponseBody返回Json数据在log4j中输出 SpringMVC中怎么将@ResponseBody返回Json数据在log4j中输出 spring配置如下: <!-- json转换器 --> text/html;charset=UTF-8 controller如下: @RequestMapping("/saveUser") @ResponseBody public User saveUser(){ User user =

Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis

Redis真是好,其中的键值用起来真心强大啊有木有, 之前的文章讲过搭建了redis集群 那么咋们该如何调用单机版的redis以及集群版的redis来使用缓存服务呢? 先讲讲单机版的,单机版redis安装非常简单,不多说了,直接使用命令:  1 [root@nginx bin]# ./redis-server redis.conf  启动就行 在sprig文件中配置如下 1 <!-- 2 TODO: 3 开发环境使用单机版 4 生产环境务必切换成集群 5 --> 6 <!-- 配置red

Spring+SpringMVC+Mybatis配置整合

前言 关于SSM框架整合的问题,网络上有很多资源,但是最近想自己配置的时候却发现总是找不到一个完整的配置教程或完整的代码.有一些比较旧的博客里面讲了一些,但是spring的版本还都是3点几.最近自己从网上各个地方找了一些教程,然后试着自己配置了一下,遇到了很多问题,包括报各种各样的异常.现在终于搞好了,记录一下以备不时之需. 正文 话不多说,直接上干货. 在创建好maven的webapp之后,在pom.xml中加入一些配置.完整的文件如下. <project xmlns="http://m

SpringMVC 中HttpMessageConverter简介

一.问题描述: 在SprinvMVC的Web程序中,我在页面发送Ajax 的POST请求,然后在服务器端利用@requestBody接收请求body中的参数,当时运行过程中,我想服务器发送Ajax请求,浏览器一直反馈415 Unsupported Media Type或者400的状态码,以为是Ajax写的有问题.便查找了半天资料,才发现spring-mvc.config文件的配置中少了东西,当然也有可能是你真的在Ajax中缺少了对Content-Type参数的设置.分析后应该是我springMV

springmvc中实现quartz定时任务(每分钟的第3秒执行任务调度方法)

1:实现触发器,最大的问题是jar包的处理(*.jar定时jar和sourcecodesource code): 此处,最关键的jar为第二个,名字最长. maven依赖: <dependency> <groupId>org.apache.servicemix.bundles</groupId> <artifactId>org.apache.servicemix.bundles.spring-context-support</artifactId>

表单数据-使用springmvc中controller怎么实现JSP页面数据提交到oracle数据库,求代码。

问题描述 使用springmvc中controller怎么实现JSP页面数据提交到oracle数据库,求代码. 如何使用controller进行JSP页面输入数据的存储,如图,怎么写这个功能的代码,将咨询内容提交到后台数据库中,然后在后台管理的页面进行对该问题的回复.求大神给写个代码.谢谢. 解决方案 你要把数据传递到后台,然后在保存到数据库里面,建议使用Ajax操作,先把数据传递到后台,通过业务逻辑保存好了之后,再把你的回复通过Ajax的回调函数返回到界面 解决方案二: 怎么写的,求给个代码.

value属性-SpringMVC中注解事物注解

问题描述 SpringMVC中注解事物注解 @Transational(value="",rollbackFor = Exception.class)中的value属性是什么意思,有什么用呢 解决方案 这个value的意思是指定,事务处理器.如spring配置中:,java代码中:@Transational(value="transactionManager",rollbackFor = Exception.class).说明此事务交由谁去处理,一般用于多事务处理器

springmvc在配置dbcp数据库连接池时出错

问题描述 springmvc在配置dbcp数据库连接池时出错 数据源配置 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [E:javaEE.metadata.me_tcat7webappsspringmvcWEB-INFclassesspringapplicationContext-dao.xml]: BeanP

SpringMVC 中的Interceptor 拦截器

  1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors>  <!-- 日志拦截器 -->  <mvc:interceptor>   <mvc:mapping path="/**" />   <mvc:exclude-mapping path="/static/**" />   <bean class="拦截器java代码路径" />