redis集成使用(一)
序:
redis的集成其实有2中:
1.spring-data-redis + jedis (这种方式我自己还没有实际使用过)
2.只使用jedis,自己封装工具类,有人说这种方式灵活些,我也这样觉得,因为看的非常清晰,呵呵
一,jar引入
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.1.0</version>
</dependency>
二,配置文件
可以由spring的配置文件include,也可以直接放在spring的配置文件里
<!-- 连接池的配置信息 -->
<bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 说明一个pool可以有多少个Jedis实例 -->
<property name="maxActive" value="10" />
<!-- 最大Idle -->
<property name="maxIdle" value="5" />
<!-- 最小Idle -->
<property name="minIdle" value="1" />
<!-- 获得一个jedis实例的时候是否检查连接可用性(ping()) -->
<property name="testOnBorrow" value="true" />
<!-- return 一个jedis实例给pool时,是否检查连接可用性(ping()) -->
<property name="testOnReturn" value="true" />
<!-- idle状态监测用异步线程evict进行检查, -->
<property name="testWhileIdle" value="true" />
<!-- 一次最多evict的pool里的jedis实例个数 -->
<property name="numTestsPerEvictionRun" value="10" />
<!-- test idle 线程的时间间隔 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!--最大等待wait时间 -->
<property name="maxWait" value="3000" />
<property name="whenExhaustedAction" value="1" />
</bean>
<!-- redisClient配置 -->
<bean id="redisClient" class="com.tjhx.core.common.redis.RedisClient" depends-on="jedisConfig">
<constructor-arg name="poolConfig" ref="jedisConfig" />
<constructor-arg name="host" value="127.0.0.1" />
<constructor-arg name="port" value="6379" />
<constructor-arg name="password" value="" />
</bean>
看起来非常明了,就一个是redis连接池配置,一个是redisClient配置
三,redisClient客户端实例类
package com.tjhx.core.common.redis;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* redis客户端
*
*/
public class RedisClient {
/**
* jedis对象池
*/
private JedisPool jedisPool;
/**
* redis编码
*/
private String charSet = "UTF-8";
private static Logger logger = Logger.getLogger(RedisClient.class);
public RedisClient(final JedisPoolConfig poolConfig, final String host, final int port, final String password) {
try {
if (StringUtils.isEmpty(password)) {
jedisPool = new JedisPool(poolConfig, host, port);
} else {
jedisPool = new JedisPool(poolConfig, host, port, 60, password);
}
Jedis jedis = getJedis();
returnJedis(jedis);
} catch (Exception e) {
logger.error("Jedis Pool init failed:", e);
}
}
/**
* 构造器
*
* @param maxTotal
* 最大连接数
* @param password
* 密码
*/
public RedisClient(int maxTotal, String password) {
init(maxTotal, password);
}
/**
* 构造器
*
* @param maxTotal
* 最大连接数
*/
public RedisClient(int maxTotal) {
this(maxTotal, null);
}
/**
* 初始化
*/
private void init(int maxTotal, String password) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxActive(maxTotal);
config.setMaxIdle(5);
config.setMinIdle(1);
config.setWhenExhaustedAction((byte) 1);
config.setMaxWait(10000);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
config.setTestWhileIdle(true);
config.setTimeBetweenEvictionRunsMillis(-1);
if (password == null) {
jedisPool = new JedisPool(config, "127.0.0.1", 6379);
} else {
jedisPool = new JedisPool(config, "127.0.0.1", 6379, 60, password);
}
}
/**
* 获取字符串
*
* @param key
* @return
*/
public String get(String key) {
Jedis jedis = getJedis();
try {
return jedis.get(key);
} catch (Exception e) {
e.printStackTrace();
} finally {
returnJedis(jedis);
}
return null;
// return (String)handle("get",key);
}
/**
* 设置字符串
*
* @param key
* @param value
*/
public String set(String key, String value) {
Jedis jedis = getJedis();
try {
return jedis.set(key, value);
} catch (Exception e) {
e.printStackTrace();
} finally {
returnJedis(jedis);
}
return null;
}
public Long set(String key, String value, int seconds) {
Jedis jedis = getJedis();
try {
jedis.set(key, value);
return jedis.expire(key, seconds);
} catch (Exception e) {
e.printStackTrace();
} finally {
returnJedis(jedis);
}
return null;
}
/**
* 获取字符串
*
* @param key
* @return
*/
public Object getObject(String key) {
Jedis jedis = getJedis();
try {
byte[] bKey = key.getBytes(charSet);
byte[] bRes = jedis.get(bKey);
// byte[] bRes=(byte[])handle("get",bKey);
if (bRes != null) {
return SerializeUtil.unserialize(bRes);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
returnJedis(jedis);
}
return null;
}
/**
* 设置字符串
*
* @param key
* @param value
* 可序列化
*/
public String setObject(String key, Object value) {
Jedis jedis = getJedis();
try {
byte[] bKey = key.getBytes(charSet);
byte[] bValue = SerializeUtil.serialize(value);
return jedis.set(bKey, bValue);
// return (String)handle("set",bKey, bValue);
} catch (Exception e) {
e.printStackTrace();
} finally {
returnJedis(jedis);
}
return null;
}
public Long setObject(String key, Object value, int seconds) {
Jedis jedis = getJedis();
try {
byte[] bKey = key.getBytes(charSet);
byte[] bValue = SerializeUtil.serialize(value);
jedis.set(bKey, bValue);
return jedis.expire(key, seconds);
} catch (Exception e) {
e.printStackTrace();
} finally {
returnJedis(jedis);
}
return null;
}
/**
* 删除
*
* @param keys
* @return
*/
public Long del(String... keys) {
Jedis jedis = getJedis();
try {
return jedis.del(keys);
} catch (Exception e) {
e.printStackTrace();
} finally {
returnJedis(jedis);
}
return null;
// return (Long)handle("del",keys);
}
/**
* 设置生存时间
*
* @param key
* @param seconds
*/
public Long expire(String key, int seconds) {
Jedis jedis = getJedis();
return jedis.expire(key, seconds);
// return (Long)handle("expire",key, seconds);
}
/**
* 获取jedis对象
*
* @return
*/
public Jedis getJedis() {
Jedis jedis = jedisPool.getResource();
return jedis;
}
/**
* 释放jedis资源
*
* @param jedis
*/
public void returnJedis(Jedis jedis) {
if (jedis != null) {
jedisPool.returnResource(jedis);
}
}
}
这是最基本的客户端实例类,是不是也看起来很清晰。
四,使用
说到使用,不得不说jUnit测试了,很多接口Dao层,service层测试不可能每次都在项目里通过界面测,那将是灾难。顺手将junit引入项目了,不然我也不好写测试总结。
redis的junit测试类
就这样就ok了,这时候先不运行,先打开redis客户端:
如果客户端显示有数据,为保证直观,可以打开控制台,输入flushall命令清除所有。
然后允许测试类,run as junit test,再来看redis控制台:
看到没,数据已经在里面了,key为1,我查询的id为4的数据,转json字符串存储的。看上图代码。
取那就是使用的get方法了,你懂的。
这就是最基本的使用了。
后期看看redis集群怎么弄。