由於集羣須要的服務器至少是6
臺,使用Redis
集羣的成本很高,因此若是沒有業務要求,不會使用Redis
集羣。
而使用Redis
集羣的公司,爲了節省成本,通常只會在生產環境使用集羣,而開發環境使用Redis
單機版,因此咱們在整合項目的時候,單機版和集羣版都要有。java
咱們能夠建立一個接口,再編寫單機版和集羣版的實現類,使用spring
進行管理,在部署時,使用哪一種Redis
,就切換那種實現類。node
package com.pc.redis; /** * Redis工具接口 * * @author Switch * @data 2017年2月11日 * @version V1.0 */ public interface RedisUtils { /** * 保存 * * @param key * 鍵 * @param value * zhi */ public void set(String key, String value); /** * 保存並設置生存時間 * * @param key * 鍵 * @param value * 值 * @param seconds * 時間,秒s爲單位 */ public void set(String key, String value, Integer seconds); /** * 根據key查詢 * * @param key * 鍵 * @return 值 */ public String get(String key); /** * 刪除 * * @param key * 鍵 */ public void del(String key); /** * 根據key設置生存時間 * * @param key * 鍵 * @param seconds * 時間,秒s爲單位 */ public void expire(String key, Integer seconds); /** * value加一<br/> * 注意key必須是整型 * * @param key * 鍵 * @return 加一後的結果 */ public Long incr(String key); }
package com.pc.redis.impl; import org.springframework.beans.factory.annotation.Autowired; import com.pc.redis.RedisUtils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * Redis鏈接池工具類 * * @author Switch * @data 2017年2月11日 * @version V1.0 */ public class RedisPool implements RedisUtils { @Autowired private JedisPool jedisPool; @Override public void set(String key, String value) { Jedis jedis = this.getJedis(); jedis.set(key, value); this.releaseJedis(jedis); } @Override public void set(String key, String value, Integer seconds) { Jedis jedis = this.getJedis(); jedis.set(key, value); jedis.expire(key, seconds); this.releaseJedis(jedis); } @Override public String get(String key) { Jedis jedis = this.getJedis(); String result = jedis.get(key); this.releaseJedis(jedis); return result; } @Override public void del(String key) { Jedis jedis = this.getJedis(); jedis.del(key); this.releaseJedis(jedis); } @Override public void expire(String key, Integer seconds) { Jedis jedis = this.getJedis(); jedis.expire(key, seconds); this.releaseJedis(jedis); } @Override public Long incr(String key) { Jedis jedis = this.getJedis(); Long count = jedis.incr(key); this.releaseJedis(jedis); return count; } /** * 獲取Jedis鏈接 * * @return Jedis鏈接 */ public Jedis getJedis() { return this.jedisPool.getResource(); } /** * 釋放Jedis鏈接 * * @param jedis * jedis鏈接 */ public void releaseJedis(Jedis jedis) { jedis.close(); } }
package com.pc.redis.impl; import org.springframework.beans.factory.annotation.Autowired; import com.pc.redis.RedisUtils; import redis.clients.jedis.JedisCluster; /** * Redis集羣工具類 * * @author Switch * @data 2017年2月11日 * @version V1.0 */ public class RedisCluster implements RedisUtils { @Autowired private JedisCluster jedisCluster; @Override public void set(String key, String value) { this.jedisCluster.set(key, value); } @Override public void set(String key, String value, Integer seconds) { this.jedisCluster.set(key, value); this.jedisCluster.expire(key, seconds); } @Override public String get(String key) { return this.jedisCluster.get(key); } @Override public void del(String key) { this.jedisCluster.del(key); } @Override public void expire(String key, Integer seconds) { this.jedisCluster.expire(key, seconds); } @Override public Long incr(String key) { return this.jedisCluster.incr(key); } /** * 獲取JedisCluster對象<br/> * 能夠直接使用它來進行redis操做 * * @return JedisCluster對象 */ public JedisCluster getJedisCluster() { return jedisCluster; } }
建立applicationContext-redis.xml
redis
通常來書,spring
配置文件分類以後,會將下面的配置放在applicationContext-dao.xml
配置文件中。spring
<!-- 配置 讀取properties文件 --> <context:property-placeholder location="classpath:resource/*.properties" />
注意:使用的時候開啓一個配置便可。數據庫
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 兩種方案:使用jedis鏈接池(單機版)和jedis集羣 --> <!-- 通常生產環境使用集羣,開發環境使用單機版 --> <!-- 使用哪一種,能夠將另外一種註釋掉 --> <!-- 注意:若是在注入工具類的時候是按類型注入的話,那麼不使用的工具類必須註釋掉--> <!-- 單機版 --> <!-- 配置jedis鏈接池 --> <bean class="redis.clients.jedis.JedisPool"> <constructor-arg name="host" value="${redis.host}" /> <constructor-arg name="port" value="${redis.port}" /> </bean> <!-- 配置單機版工具類 --> <bean class="com.pc.redis.impl.RedisPool" /> <!-- 集羣版 --> <!-- 配置jedis集羣 --> <bean class="redis.clients.jedis.JedisCluster"> <constructor-arg name="nodes"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host1}" /> <constructor-arg name="port" value="${cluster.port1}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host2}" /> <constructor-arg name="port" value="${cluster.port2}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host3}" /> <constructor-arg name="port" value="${cluster.port3}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host4}" /> <constructor-arg name="port" value="${cluster.port4}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host5}" /> <constructor-arg name="port" value="${cluster.port5}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host6}" /> <constructor-arg name="port" value="${cluster.port6}" /> </bean> </set> </constructor-arg> </bean> <!-- 配置集羣版工具類 --> <bean class="com.pc.redis.impl.RedisCluster" /> </beans>
#redis單機版信息 redis.host=192.168.37.131 redis.port=6379 #redis集羣版信息 cluster.host1=192.168.37.131 cluster.port1=7001 cluster.host2=192.168.37.131 cluster.port2=7002 cluster.host3=192.168.37.131 cluster.port3=7003 cluster.host4=192.168.37.131 cluster.port4=7004 cluster.host5=192.168.37.131 cluster.port5=7005 cluster.host6=192.168.37.131 cluster.port6=7006
MySQL
中查詢redis
中不可以影響正常的業務邏輯,能夠進行try/catch
json
package com.pc.test; import org.springframework.beans.factory.annotation.Autowired; import com.pc.redis.RedisUtils; /** * 緩存測試類 * * @author Switch * @data 2017年2月11日 * @version V1.0 */ public class RedisCacheTest { // 注入Redis工具類 @Autowired private RedisUtils redisUtils; @Override public String queryByRedis() { String key = "redis"; // 1.從緩存中命中 try { String redisJson = redisUtils.get(key); if (StringUtils.isNotBlank(redisJson)) { return redisJson; } } catch (Exception e) { e.printStackTrace(); } // 2.若是沒用命中,執行原有邏輯,從數據庫中獲取數據 // 未實現,從數據庫中獲取數據 String json = getFromDB(); // 3.將查詢出來的結果加入緩存 try { this.redisUtils.set(key, json); this.redisUtils.expire(key, 60 * 60 * 24); } catch (Exception e) { e.printStackTrace(); } return json; } }