1、集成環境java
Tomcat7mysql
JDK1.7
web
Jedis-2.7.2redis
Spring-4.1.6spring
2、資源依賴sql
(省略,網上不少)
shell
3、集成過程
服務器
一、配置資源池mybatis
這裏使用Jedis的ShardedJedisPool來管理,咱們定義該配置文件爲:spring-redis.xml,所有內容以下:ide
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd"> <!-- 引入jedis配置文件 --> <context:property-placeholder location="classpath:conf/properties/redis.properties" ignore-unresolvable="true" /> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal"> <value>${redis.pool.maxActive}</value> </property> <property name="maxIdle"> <value>${redis.pool.maxIdle}</value> </property> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="true"/> </bean> <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" scope="singleton"> <constructor-arg index="0" ref="jedisPoolConfig" /> <constructor-arg index="1"> <list> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg name="host" value="${redis.uri}" /> </bean> </list> </constructor-arg> </bean> </beans>
幾個注意的點:
(1)若是你有多個數據源須要經過<context:property-placeholder管理,且不肯意放在一個配置文件裏,那麼必定要加上ignore-unresolvable=「true"
(2)注意新版的(具體從哪一個版本開始不清楚,有興趣能夠查一下)JedisPoolConfig的property name,不是maxActive而是maxTotal,並且沒有maxWait屬性,建議看一下Jedis源碼。
(3)ShardedJedisPool有多種構造函數,選擇你須要的(具體看源碼),示例中只初始化了一個分片,並使用了經過指定host的構造器(具體格式見下文),若是有集羣,在<list>下增長新的<bean>便可。
(4)固然,你的spring核心配置文件中得有<context:component-scan base-package="com.xxxx.xxx"/>掃描組件。
二、準備redis.properties,內容以下:
redis.pool.maxActive=200 redis.pool.maxIdle=50 redis.pool.minIdle=10 redis.pool.maxWaitMillis=20000 redis.pool.maxWait=300 redis.uri = redis://password@127.0.0.1:6379/0 redis.timeout=30000
這裏要注意redis.uri的格式:redis://[密碼]@[服務器地址]:[端口]/[db index]
建議你們使用這種方式,配置內容少,還能自定義db index,很是適合開發、測試和線上環境的切換
三、將spring-redis.xml加入web.xml的context中,以下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/spring-redis.xml</param-value>
</context-param>
若是你有多個數據源經過spring管理(如mysql),則同時加載,以下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/spring-mybatis.xml,classpath:conf/spring-redis.xml</param-value>
</context-param>
三、以上全部的配置已完成,接下來的代碼的實現
(1)推薦你們使用統一的類來管理Jedis實例的生成和回收,參考代碼以下:JedisDataSourceImpl.class
@Repository("jedisDS") public class JedisDataSourceImpl implements JedisDataSource { private static final Logger LOG = LoggerFactory.getLogger(JedisDataSourceImpl.class); @Autowired private ShardedJedisPool shardedJedisPool; @Override public ShardedJedis getRedisClient() { ShardedJedis shardJedis = null; try { shardJedis = shardedJedisPool.getResource(); return shardJedis; } catch (Exception e) { LOG.error("[JedisDS] getRedisClent error:" + e.getMessage()); if (null != shardJedis) shardJedis.close(); } return null; } @Override public void returnResource(ShardedJedis shardedJedis) { shardedJedis.close(); } @Override public void returnResource(ShardedJedis shardedJedis, boolean broken) { shardedJedis.close(); } }
這裏要注意的是Jedis實例的回收,從jedis2.6開始,原returnResource方式已經提示在後續版本中再也不支持,因此不建議你們再用ShardedJedisPool裏的returnResource和retureBrokenResource方法,雖然在2.7中還支持(畢竟是由於這兩個方法存在漏洞)。
(2)編寫具體的Jedis操做類(片段):RedisClientTemplate.class
@Repository("redisClientTemplate") public class RedisClientTemplate { private static final Logger log = LoggerFactory.getLogger(RedisClientTemplate.class); @Autowired private JedisDataSource redisDataSource; public void disconnect() { ShardedJedis shardedJedis = redisDataSource.getRedisClient(); shardedJedis.disconnect(); } /** * 設置單個值 * * @param key * @param value * @return */ public String set(String key, String value) { String result = null; ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.set(key, value); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } /** * 獲取單個值 * * @param key * @return */ public String get(String key) { String result = null; ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.get(key); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public Boolean exists(String key) { Boolean result = false; ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.exists(key); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public String type(String key) { String result = null; ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.type(key); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } /** * 在某段時間後失效 * * @param key * @param seconds * @return */ public Long expire(String key, int seconds) { Long result = null; ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.expire(key, seconds); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } /** * 在某個時間點失效 * * @param key * @param unixTime * @return */ public Long expireAt(String key, long unixTime) { Long result = null; ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.expireAt(key, unixTime); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public Long ttl(String key) { Long result = null; ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.ttl(key); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public boolean setbit(String key, long offset, boolean value) { ShardedJedis shardedJedis = redisDataSource.getRedisClient(); boolean result = false; if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.setbit(key, offset, value); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public boolean getbit(String key, long offset) { ShardedJedis shardedJedis = redisDataSource.getRedisClient(); boolean result = false; if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.getbit(key, offset); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public long setRange(String key, long offset, String value) { ShardedJedis shardedJedis = redisDataSource.getRedisClient(); long result = 0; if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.setrange(key, offset, value); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public String getRange(String key, long startOffset, long endOffset) { ShardedJedis shardedJedis = redisDataSource.getRedisClient(); String result = null; if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.getrange(key, startOffset, endOffset); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } }
(3)好了,接下來在你的業務代碼里加載RedisClientTemplate.class就能夠了。