您的位置:首页 > 数据库 > Redis

Redis入门很简单之五【Jedis和Spring的整合】

2015-12-08 17:51 579 查看
在上一篇文章中,简单介绍了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代码


<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:

Java代码


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如下所示:

Java代码


public static byte[] serialize(Object source);

public static Object deserialize(byte[] source);

该工具类的具体实现:

Java代码


/**

* 功能简述: 序列化工具类,负责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值。

Java代码


Userinfo actual = new Userinfo(140520, "Nick Xu",

new Date(Timestamp.valueOf("1990-11-11 00:00:00").getTime()));

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

Java代码


String key = "user.userid." + actual.getUserId();

jedis.set(key.getBytes(), SerializingUtil.serialize(actual));

Userinfo expected = (Userinfo) SerializingUtil.deserialize(jedis.get(key.getBytes()));

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

Java代码


assertEquals(expected, actual);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: