spring 结合 redis 正确从jedisConnectionFactory获取Jedis实例

时间:2025-03-20 09:03:20

网上流传着这样一种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;
}
 

而且没有应用连接池。如果我们想从jedisConnectionFactory获取Jedis实例又想使用连接池。可以这样:

	private Jedis getJedis() {
		if (jedis == null) {
            jedisConnection = ();
            jedis = ();
			return jedis;
		}
		return jedis;
	}

这样Jedis实例就受连接池管理了。不过每次我们操作完了 必须把连接释放,放回连接池。();这个close不是真正的关闭,而是将连接放回连接池。