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

来源:互联网 发布:淘宝助理 批量编辑 编辑:程序博客网 时间:2024/05/18 02:52

网上流传着这样一种spring结合redis的例子,从jedisConnectionFactory获取Jedis实例。其他部分忽略只看RedisService,这样获取jedis实例存在很多问题。
这样每次创建新的连接而没有关闭连接。在有大量操作的时候很快就会将redis的连接都占满。报redis连接错误。

package com.mkfree.redis.test;import java.util.Set;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import redis.clients.jedis.Jedis;/** * 封装redis 缓存服务器服务接口 * @author hk * * 2012-12-16 上午3:09:18 */public class RedisService {    /**     * 通过key删除(字节)     * @param key     */    public void del(byte [] key){        this.getJedis().del(key);    }    /**     * 通过key删除     * @param key     */    public void del(String key){        this.getJedis().del(key);    }    /**     * 添加key value 并且设置存活时间(byte)     * @param key     * @param value     * @param liveTime     */    public void set(byte [] key,byte [] value,int liveTime){        this.set(key, value);        this.getJedis().expire(key, liveTime);    }    /**     * 添加key value 并且设置存活时间     * @param key     * @param value     * @param liveTime     */    public void set(String key,String value,int liveTime){        this.set(key, value);        this.getJedis().expire(key, liveTime);    }    /**     * 添加key value     * @param key     * @param value     */    public void set(String key,String value){        this.getJedis().set(key, value);    }    /**添加key value (字节)(序列化)     * @param key     * @param value     */    public void set(byte [] key,byte [] value){        this.getJedis().set(key, value);    }    /**     * 获取redis value (String)     * @param key     * @return     */    public String get(String key){        String value = this.getJedis().get(key);        return value;    }    /**     * 获取redis value (byte [] )(反序列化)     * @param key     * @return     */    public byte[] get(byte [] key){        return this.getJedis().get(key);    }    /**     * 通过正则匹配keys     * @param pattern     * @return     */    public Set<String> keys(String pattern){        return this.getJedis().keys(pattern);    }    /**     * 检查key是否已经存在     * @param key     * @return     */    public boolean exists(String key){        return this.getJedis().exists(key);    }    /**     * 清空redis 所有数据     * @return     */    public String flushDB(){        return this.getJedis().flushDB();    }    /**     * 查看redis里有多少数据     */    public long dbSize(){        return this.getJedis().dbSize();    }    /**     * 检查是否连接成功     * @return     */    public String ping(){        return this.getJedis().ping();    }    /**     * 获取一个jedis 客户端     * @return     */    private Jedis getJedis(){        if(jedis == null){            return jedisConnectionFactory.getShardInfo().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 = jedisConnectionFactory.getConnection();            jedis = jedisConnection.getNativeConnection();return jedis;}return jedis;}

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

2 0
原创粉丝点击