网上流传着这样一种spring结合redis的例子,从jedisConnectionFactory获取Jedis实例。其他部分忽略只看RedisService,这样获取jedis实例存在很多问题。
这样每次创建新的连接而没有关闭连接。在有大量操作的时候很快就会将redis的连接都占满。报redis连接错误。
package ;
import ;
import ;
import ;
import ;
import ;
/**
* 封装redis 缓存服务器服务接口
* @author hk
*
* 2012-12-16 上午3:09:18
*/
public class RedisService {
/**
* 通过key删除(字节)
* @param key
*/
public void del(byte [] key){
().del(key);
}
/**
* 通过key删除
* @param key
*/
public void del(String key){
().del(key);
}
/**
* 添加key value 并且设置存活时间(byte)
* @param key
* @param value
* @param liveTime
*/
public void set(byte [] key,byte [] value,int liveTime){
(key, value);
().expire(key, liveTime);
}
/**
* 添加key value 并且设置存活时间
* @param key
* @param value
* @param liveTime
*/
public void set(String key,String value,int liveTime){
(key, value);
().expire(key, liveTime);
}
/**
* 添加key value
* @param key
* @param value
*/
public void set(String key,String value){
().set(key, value);
}
/**添加key value (字节)(序列化)
* @param key
* @param value
*/
public void set(byte [] key,byte [] value){
().set(key, value);
}
/**
* 获取redis value (String)
* @param key
* @return
*/
public String get(String key){
String value = ().get(key);
return value;
}
/**
* 获取redis value (byte [] )(反序列化)
* @param key
* @return
*/
public byte[] get(byte [] key){
return ().get(key);
}
/**
* 通过正则匹配keys
* @param pattern
* @return
*/
public Set<String> keys(String pattern){
return ().keys(pattern);
}
/**
* 检查key是否已经存在
* @param key
* @return
*/
public boolean exists(String key){
return ().exists(key);
}
/**
* 清空redis 所有数据
* @return
*/
public String flushDB(){
return ().flushDB();
}
/**
* 查看redis里有多少数据
*/
public long dbSize(){
return ().dbSize();
}
/**
* 检查是否连接成功
* @return
*/
public String ping(){
return ().ping();
}
/**
* 获取一个jedis 客户端
* @return
*/
private Jedis getJedis(){
if(jedis == null){
return ().createResource();
}
return jedis;
}
private RedisService (){
}
//操作redis客户端
private static Jedis jedis;
@Autowired
@Qualifier("jedisConnectionFactory")
private JedisConnectionFactory jedisConnectionFactory;
}
package ;
import ;
import ;
import ;
import ;
import ;
/**
* 封装redis 缓存服务器服务接口
* @author hk
*
* 2012-12-16 上午3:09:18
*/
public class RedisService {
/**
* 通过key删除(字节)
* @param key
*/
public void del(byte [] key){
().del(key);
}
/**
* 通过key删除
* @param key
*/
public void del(String key){
().del(key);
}
/**
* 添加key value 并且设置存活时间(byte)
* @param key
* @param value
* @param liveTime
*/
public void set(byte [] key,byte [] value,int liveTime){
(key, value);
().expire(key, liveTime);
}
/**
* 添加key value 并且设置存活时间
* @param key
* @param value
* @param liveTime
*/
public void set(String key,String value,int liveTime){
(key, value);
().expire(key, liveTime);
}
/**
* 添加key value
* @param key
* @param value
*/
public void set(String key,String value){
().set(key, value);
}
/**添加key value (字节)(序列化)
* @param key
* @param value
*/
public void set(byte [] key,byte [] value){
().set(key, value);
}
/**
* 获取redis value (String)
* @param key
* @return
*/
public String get(String key){
String value = ().get(key);
return value;
}
/**
* 获取redis value (byte [] )(反序列化)
* @param key
* @return
*/
public byte[] get(byte [] key){
return ().get(key);
}
/**
* 通过正则匹配keys
* @param pattern
* @return
*/
public Set<String> keys(String pattern){
return ().keys(pattern);
}
/**
* 检查key是否已经存在
* @param key
* @return
*/
public boolean exists(String key){
return ().exists(key);
}
/**
* 清空redis 所有数据
* @return
*/
public String flushDB(){
return ().flushDB();
}
/**
* 查看redis里有多少数据
*/
public long dbSize(){
return ().dbSize();
}
/**
* 检查是否连接成功
* @return
*/
public String ping(){
return ().ping();
}
/**
* 获取一个jedis 客户端
* @return
*/
private Jedis getJedis(){
if(jedis == null){
return ().createResource();
}
return jedis;
}
private RedisService (){
}
//操作redis客户端
private static Jedis jedis;
@Autowired
@Qualifier("jedisConnectionFactory")
private JedisConnectionFactory jedisConnectionFactory;
}
而且没有应用连接池。如果我们想从jedisConnectionFactory获取Jedis实例又想使用连接池。可以这样:
private Jedis getJedis() {
if (jedis == null) {
jedisConnection = ();
jedis = ();
return jedis;
}
return jedis;
}
这样Jedis实例就受连接池管理了。不过每次我们操作完了 必须把连接释放,放回连接池。();这个close不是真正的关闭,而是将连接放回连接池。