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); }