Redis入門簡単その5【JedisとSpringの統合】


前回の記事ではJedisの接続プールの使い方を簡単に紹介しました.
Springと統合すれば、より簡潔で柔軟性が得られ、より優雅な方法であることは明らかです.
 
[一].構築環境:1.以前のバージョンの基礎の上で、spring.jar   commons-logging.jar   log4j-1.2.15.jarログプロファイル:log 4 jを同時に追加する.propertiesはclasspathの下にあります. 2. Springファイルの構成:アプリケーションContext.xml注意:接続プールjedisPoolの構成は、JedisのAPIと一致する構造注入を使用します.portを注入する場合はtype=「int」を使用して注入のパラメータタイプを指定する必要があります.そうしないと、異常が発生します.
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  
      <!--   redis     -->
      <context:property-placeholder location="classpath:redis.properties"/>
      
      <!-- redis       -->
      <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
          <property name="maxActive" value="${redis.pool.maxActive}"/>
          <property name="maxIdle" value="${redis.pool.maxIdle}"/>
          <property name="minIdle" value="${redis.pool.minIdle}"/>
          <property name="maxWait" value="${redis.pool.maxWait}"/>
          <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
          <property name="testOnReturn" value="${redis.pool.testOnReturn}"/>
      </bean>
      
      <!-- redis    pool,     :timeout/password  -->
      <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.password}"/>
      </bean>
      
  </beans>

 
[二].SPringコンテナからJedisPoolを取得するには:
 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
 JedisPool pool = (JedisPool) context.getBean("jedisPool");
 Jedis jedis = pool.getResource();
  ...
 pool.returnResource(jedis);

 
[三].キャッシュJavaBean:前の記事では、Jedisの使用に関する基本的な説明がありました. 
もちろん、多くの場合、RedisがJavaBeanをキャッシュすることを望んでいます.これはJDKが提供するシーケンス化技術を借りる必要があります.   1. キャッシュエンティティにシリアル化Serializableインタフェースを実装する必要があります.ここではUserinfoを例に挙げます.   2. シーケンス化ツールクラス:Jedisのシーケンス化のサポートは、バイト配列byte[]をパラメータとして提供します.このためにSerializingUtilツールクラスを作成し、byte[]とJavaBean間の相互変換を担当します.この方法のAPIは以下の通りである.
 public static byte[] serialize(Object source); 
 public static Object deserialize(byte[] source);

このツールクラスの具体的な実装:
/**
 *     :       ,  byte[] Object       .
 * @author Nick Xu
 * @version 1.0
 */
public class SerializingUtil {
    
    private static Log logger = LogFactory.getLog(SerializingUtil.class);
    
    /**
     *     :    Bean       .
     * @param source       
     * @return          
     * @throws Exception
     */
    public static byte[] serialize(Object source) {
        ByteArrayOutputStream byteOut = null;
        ObjectOutputStream ObjOut = null;
        try {
            byteOut = new ByteArrayOutputStream();
            ObjOut = new ObjectOutputStream(byteOut);
            ObjOut.writeObject(source);
            ObjOut.flush();
        }
        catch (IOException e) {
            logger.error(source.getClass().getName()
                + " serialized error !", e);
        }
        finally {
            try {
                if (null != ObjOut) {
                    ObjOut.close();
                }
            }
            catch (IOException e) {
                ObjOut = null;
            }
        }
        return byteOut.toByteArray();
    }
    
    /**
     *     :             Bean.
     * @param source              
     * @return         Bean
     * @throws Exception
     */
    public static Object deserialize(byte[] source) {
        ObjectInputStream ObjIn = null;
        Object retVal = null;
        try {
            ByteArrayInputStream byteIn = new ByteArrayInputStream(source);
            ObjIn = new ObjectInputStream(byteIn);
            retVal = ObjIn.readObject();
        }
        catch (Exception e) {
            logger.error("deserialized error  !", e);
        }
        finally {
            try {
                if(null != ObjIn) {
                    ObjIn.close();
                }
            }
            catch (IOException e) {
                ObjIn = null;
            }
        }
        return retVal;
    }
}

 3. JavaBeanの格納と取得:エンティティの定義:Timestampクラスを使用してms値を取得します.
Userinfo actual = new Userinfo(140520, "Nick Xu", 
new Date(Timestamp.valueOf("1990-11-11 00:00:00").getTime()));

Jedis操作を使用:key、valueはbyte[]バイト配列に変換する必要があります.
String key = "user.userid." + actual.getUserId();
jedis.set(key.getBytes(), SerializingUtil.serialize(actual));
Userinfo expected = (Userinfo) SerializingUtil.deserialize(jedis.get(key.getBytes()));

オブジェクトの比較:equalsメソッドとhashCodeメソッドを上書きする必要があります.   
 assertEquals(expected, actual);