JedisPool使用實戰

JedisPool是jedis客戶端鏈接池,典型使用方式以下: java

Jedis jedis = pool.getResource();
        try {
            //操做redis
            jedis.set("key" , "value") ;
        } catch (JedisException e) {
            pool.returnBrokenResource(jedis);
        }finally {
            pool.returnResource(jedis);

        }

這種代碼寫到寫多了真的會吐血,一不當心忘了返還jedis到pool,問題就大了。因而想起spring jdbctemplate 實現方式,因此有了一下使用方式: redis

RedisTemplate redisTemplate = new RedisTemplate(RedisFactory.getInstance("redis.properties").getJedisPool());

        String value = redisTemplate.execute(new RedisCallback<String>() {
            @Override
            public String handle(Jedis jedis) {
                return jedis.get("key");
            }
        }) ;

哈哈,不再用擔憂出錯了,RedisTemplate封裝了從JedisPool取jedis以及返回池中代碼而已,具體以下: spring

/**
 * Created by wens on 15-3-19.
 */
public class RedisTemplate {

    private JedisPool jedisPool ;

    public RedisTemplate(JedisPool jedisPool){
        this.jedisPool = jedisPool ;
    }

    public <T> T  execute(RedisCallback<T> callback){

        Jedis jedis = jedisPool.getResource();
        boolean broken = false;
        try {
            return callback.handle( jedis);
        } catch (JedisException e) {
            broken = true;
            throw  new RedisException(e);
        } catch (Exception e) {
            throw  new RedisException(e);
        } finally {
            returnResource(jedis, broken);

        }

    }

    private void returnResource(Jedis jedis, boolean broken) {
        if (jedis != null) {
            if (broken) {
                jedisPool.returnBrokenResource(jedis);
            } else {
                jedisPool.returnResource(jedis);
            }
        }
    }
}

/**
 * Created by wens on 15-3-19.
 */
public interface RedisCallback<T> {
    public T handle(Jedis jedis);
}
相關文章
相關標籤/搜索