zoukankan      html  css  js  c++  java
  • Redis入门很简单之五【Jedis和Spring的整合】

    在上一篇文章中,简单介绍了Jedis的连接池使用方式。

    如果和Spring进行整合的话,我们将获得更好的简洁性、灵活性,显然是一种更加优雅(graceful)的方式。

     

    [一]. 搭建环境:
     1. 在之前版本的基础之上,添加如下的依赖:
       spring.jar
       commons-logging.jar
       log4j-1.2.15.jar
       同时添加日志配置文件:log4j.properties到classpath下面。
     2. 配置Spring文件:applicationContext.xml
       注意:连接池jedisPool的配置,这里使用了构造方式注入,这是和Jedis的API一致的;
       在注入port时,需要使用使用type = "int"指定注入的参数类型,否则出现异常。

    Xml代码  
    1. <beans xmlns="http://www.springframework.org/schema/beans"  
    2.       xmlns:context="http://www.springframework.org/schema/context"  
    3.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    5.              http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    6.     
    7.       <!-- 加载redis配置文件 -->  
    8.       <context:property-placeholder location="classpath:redis.properties"/>  
    9.         
    10.       <!-- redis连接池的配置 -->  
    11.       <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">  
    12.           <property name="maxActive" value="${redis.pool.maxActive}"/>  
    13.           <property name="maxIdle" value="${redis.pool.maxIdle}"/>  
    14.           <property name="minIdle" value="${redis.pool.minIdle}"/>  
    15.           <property name="maxWait" value="${redis.pool.maxWait}"/>  
    16.           <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>  
    17.           <property name="testOnReturn" value="${redis.pool.testOnReturn}"/>  
    18.       </bean>  
    19.         
    20.       <!-- redis的连接池pool,不是必选项:timeout/password  -->  
    21.       <bean id = "jedisPool" class="redis.clients.jedis.JedisPool">  
    22.           <constructor-arg index="0" ref="jedisPoolConfig"/>  
    23.           <constructor-arg index="1" value="${redis.host}"/>  
    24.           <constructor-arg index="2" value="${redis.port}" type="int"/>  
    25.           <constructor-arg index="3" value="${redis.timeout}" type="int"/>  
    26.           <constructor-arg index="4" value="${redis.password}"/>  
    27.       </bean>  
    28.         
    29.   </beans>  

     

    [二]. 从Spring容器中获取JedisPool:

    Java代码  
    1. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
    2. JedisPool pool = (JedisPool) context.getBean("jedisPool");  
    3. Jedis jedis = pool.getResource();  
    4.  ...  
    5. pool.returnResource(jedis);  

     

    [三]. 缓存JavaBean:
        很多时候我们都希望Redis能够对JavaBean进行缓存,这需要借助于JDK提供的序列化技术。

           1. 要求缓存实体实现了序列化Serializable接口:这里以Userinfo为例。
           2. 序列化工具类:Jedis对序列化的支持,是提供了字节数组byte[]作为参数;
        为此编写SerializingUtil工具类负责byte[]和JavaBean之间的相互转换。该方法的API如下所示:

    Java代码  
    1. public static byte[] serialize(Object source);   
    2. public static Object deserialize(byte[] source);  

       该工具类的具体实现:

    Java代码  
    1. /** 
    2.  * 功能简述: 序列化工具类,负责byte[]和Object之间的相互转换. 
    3.  * @author Nick Xu 
    4.  * @version 1.0 
    5.  */  
    6. public class SerializingUtil {  
    7.       
    8.     private static Log logger = LogFactory.getLog(SerializingUtil.class);  
    9.       
    10.     /** 
    11.      * 功能简述: 对实体Bean进行序列化操作. 
    12.      * @param source 待转换的实体 
    13.      * @return 转换之后的字节数组 
    14.      * @throws Exception 
    15.      */  
    16.     public static byte[] serialize(Object source) {  
    17.         ByteArrayOutputStream byteOut = null;  
    18.         ObjectOutputStream ObjOut = null;  
    19.         try {  
    20.             byteOut = new ByteArrayOutputStream();  
    21.             ObjOut = new ObjectOutputStream(byteOut);  
    22.             ObjOut.writeObject(source);  
    23.             ObjOut.flush();  
    24.         }  
    25.         catch (IOException e) {  
    26.             logger.error(source.getClass().getName()  
    27.                 + " serialized error !", e);  
    28.         }  
    29.         finally {  
    30.             try {  
    31.                 if (null != ObjOut) {  
    32.                     ObjOut.close();  
    33.                 }  
    34.             }  
    35.             catch (IOException e) {  
    36.                 ObjOut = null;  
    37.             }  
    38.         }  
    39.         return byteOut.toByteArray();  
    40.     }  
    41.       
    42.     /** 
    43.      * 功能简述: 将字节数组反序列化为实体Bean. 
    44.      * @param source 需要进行反序列化的字节数组 
    45.      * @return 反序列化后的实体Bean 
    46.      * @throws Exception 
    47.      */  
    48.     public static Object deserialize(byte[] source) {  
    49.         ObjectInputStream ObjIn = null;  
    50.         Object retVal = null;  
    51.         try {  
    52.             ByteArrayInputStream byteIn = new ByteArrayInputStream(source);  
    53.             ObjIn = new ObjectInputStream(byteIn);  
    54.             retVal = ObjIn.readObject();  
    55.         }  
    56.         catch (Exception e) {  
    57.             logger.error("deserialized error  !", e);  
    58.         }  
    59.         finally {  
    60.             try {  
    61.                 if(null != ObjIn) {  
    62.                     ObjIn.close();  
    63.                 }  
    64.             }  
    65.             catch (IOException e) {  
    66.                 ObjIn = null;  
    67.             }  
    68.         }  
    69.         return retVal;  
    70.     }  
    71. }  

     3. 对JavaBean的存储和获取:
            定义实体:借助于Timestamp类,获取ms值。

    Java代码  
    1. Userinfo actual = new Userinfo(140520"Nick Xu",   
    2. new Date(Timestamp.valueOf("1990-11-11 00:00:00").getTime()));  

          使用Jedis操作:key、value都需要转成byte[]字节数组。

    Java代码  
    1. String key = "user.userid." + actual.getUserId();  
    2. jedis.set(key.getBytes(), SerializingUtil.serialize(actual));  
    3. Userinfo expected = (Userinfo) SerializingUtil.deserialize(jedis.get(key.getBytes()));  

            对象的比较:需要覆写equals和hashCode方法。   

    Java代码  
    1. assertEquals(expected, actual);  
  • 相关阅读:
    第四章 证券投资基金的监管
    第三章 证券投资基金类型
    第二章 证券投资基金概述
    第一章 金融、资产管理与投资基金
    第一章附录
    第1章 为什么研究货币、银行与金融市场
    最近值得珍惜的小事
    转_如何解决linux动态库版本控制
    爆裂鼓手
    修改jupyter notebook默认路径
  • 原文地址:https://www.cnblogs.com/codestarer/p/13635588.html
Copyright © 2011-2022 走看看