Redis服務器的部署方式可分爲單機和集羣的方式,使用Jedis的對應訪問接口也相應不用。如何使用Jedis操做兩種不一樣部署方式的Redis數據,以及在web工程裏如何快速的切換兩種不一樣的訪問方式,是本文要介紹的主要內容。java
本示例使用的相關框架版本以下:node
Jedis:jedis-2.8.1web
spring:spring 4.0.8redis
涉及的主要類圖以下:spring
JedisClient與JedisClsterClient都實現了IJedisClinet接口,接口裏定義了操做redis的各類方法,這兩個Client實現類分別對應着單機和集羣兩種訪問方式。RedisOperate類是供其它類調用的Redis操做類,它持有IJedisClient接口的實現類對象,這個對象由spring注入,具體使用哪一種鏈接方式取決於注入的IJedisClient的實現類類型。這裏使用的是策略模式。apache
JedisClusterFactory實現了org.springframework.beans.factory.FactoryBean和org.springframework.beans.factory.InitializingBean接口,用於爲JedisClusterClient提供redis.clients.jedis.JedisCluster操做類。JedisClient的操做類是redis.clients.jedis.Jedis,從redis.clients.jedis.JedisPool類中獲取。緩存
Spring的配置以下:服務器
<?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:context="http://www.springframework.org/schema/context" 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" default-lazy-init="true"> <description>Jedis Configuration</description> <!-- 加載配置屬性文件 --> <context:property-placeholder ignore-unresolvable="true" location="classpath:jeeplus.properties" /> <!-- redis 單機鏈接方案 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="300" /> <!-- 最大可以保持idel狀態的對象數 --> <property name="maxTotal" value="60000" /> <!-- 最大分配的對象數 --> <property name="testOnBorrow" value="true" /> <!-- 當調用borrow Object方法時,是否進行有效性檢查 --> </bean> <bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg index="0" ref="jedisPoolConfig" /> <constructor-arg index="1" value="${redis.host}" /> <constructor-arg index="2" value="${redis.port}" type="int" /> </bean> <!-- redis 集羣鏈接方案 --> <bean name="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig"> <property name="maxWaitMillis" value="-1" /> <property name="maxTotal" value="8" /> <property name="minIdle" value="0" /> <property name="maxIdle" value="8" /> </bean> <bean id="jedisCluster" class="com.jeeplus.common.redis.JedisClusterFactory"> <property name="connectionTimeout" value="3000" /> <property name="soTimeout" value="3000" /> <property name="maxRedirections" value="5" /> <property name="genericObjectPoolConfig" ref="genericObjectPoolConfig" /> <property name="jedisClusterNodes"> <set> <value>127.0.0.1:7000</value> <value>127.0.0.1:7001</value> <value>127.0.0.1:7002</value> </set> </property> </bean> <!-- 真正的redis操做類,具體鏈接方式由jedisClient的ref屬性決定 可選項爲jedisClusterClient、jedisClient --> <bean name="redisOperate" class="com.jeeplus.common.redis.RedisOperate"> <property name="jedisClient" ref="jedisClusterClient" /> </bean> </beans>
在進行單機、集羣切換時,只須要修改<property name="jedisClient" ref="jedisClusterClient" /> 配置便可。框架
下面看看代碼:ide
IJedisClient
public interface IJedisClient { /** * 獲取緩存 * @param key 鍵 * @return 值 */ public String get(String key); /** * 獲取緩存 * @param key 鍵 * @return 值 */ public Object getObject(String key); /** * 設置緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public String set(String key, String value, int cacheSeconds); /** * 設置緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public String setObject(String key, Object value, int cacheSeconds); /** * 獲取List緩存 * @param key 鍵 * @return 值 */ public List<String> getList(String key); /** * 獲取List緩存 * @param key 鍵 * @return 值 */ public List<Object> getObjectList(String key); /** * 設置List緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public long setList(String key, List<String> value, int cacheSeconds); /** * 設置List緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public long setObjectList(String key, List<Object> value, int cacheSeconds); /** * 向List緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public long listAdd(String key, String... value); /** * 向List緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public long listObjectAdd(String key, Object... value); /** * 獲取緩存 * @param key 鍵 * @return 值 */ public Set<String> getSet(String key); /** * 獲取緩存 * @param key 鍵 * @return 值 */ public Set<Object> getObjectSet(String key); /** * 設置Set緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public long setSet(String key, Set<String> value, int cacheSeconds); /** * 設置Set緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public long setObjectSet(String key, Set<Object> value, int cacheSeconds); /** * 向Set緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public long setSetAdd(String key, String... value); /** * 向Set緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public long setSetObjectAdd(String key, Object... value); /** * 獲取Map緩存 * @param key 鍵 * @return 值 */ public Map<String, String> getMap(String key); /** * 獲取Map緩存 * @param key 鍵 * @return 值 */ public Map<String, Object> getObjectMap(String key); /** * 設置Map緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public String setMap(String key, Map<String, String> value, int cacheSeconds); /** * 設置Map緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public String setObjectMap(String key, Map<String, Object> value, int cacheSeconds); /** * 向Map緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public String mapPut(String key, Map<String, String> value); /** * 向Map緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public String mapObjectPut(String key, Map<String, Object> value); /** * 移除Map緩存中的值 * @param key 鍵 * @param value 值 * @return */ public long mapRemove(String key, String mapKey); /** * 移除Map緩存中的值 * @param key 鍵 * @param value 值 * @return */ public long mapObjectRemove(String key, String mapKey); /** * 判斷Map緩存中的Key是否存在 * @param key 鍵 * @param value 值 * @return */ public boolean mapExists(String key, String mapKey); /** * 判斷Map緩存中的Key是否存在 * @param key 鍵 * @param value 值 * @return */ public boolean mapObjectExists(String key, String mapKey); /** * 刪除緩存 * @param key 鍵 * @return */ public long del(String key); /** * 刪除緩存 * @param key 鍵 * @return */ public long delObject(String key); /** * 緩存是否存在 * @param key 鍵 * @return */ public boolean exists(String key); /** * 緩存是否存在 * @param key 鍵 * @return */ public boolean existsObject(String key); }
JedisClient
/** * 單機方式redis鏈接客戶端 * @author jimmywu * */ @Service public class JedisClient implements IJedisClient { private static Logger logger = LoggerFactory.getLogger(JedisClient.class); private JedisPool jedisPool = SpringContextHolder.getBean(JedisPool.class); public static final String KEY_PREFIX = Global.getConfig("redis.keyPrefix"); /** * 獲取緩存 * @param key 鍵 * @return 值 */ public String get(String key) { String value = null; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(key)) { value = jedis.get(key); value = StringUtils.isNotBlank(value) && !"nil".equalsIgnoreCase(value) ? value : null; logger.debug("get {} = {}", key, value); } } catch (Exception e) { logger.warn("get {} = {}", key, value, e); } finally { returnResource(jedis); } return value; } /** * 獲取緩存 * @param key 鍵 * @return 值 */ public Object getObject(String key) { Object value = null; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(getBytesKey(key))) { value = toObject(jedis.get(getBytesKey(key))); logger.debug("getObject {} = {}", key, value); } } catch (Exception e) { logger.warn("getObject {} = {}", key, value, e); } finally { returnResource(jedis); } return value; } /** * 設置緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public String set(String key, String value, int cacheSeconds) { String result = null; Jedis jedis = null; try { jedis = getResource(); result = jedis.set(key, value); if (cacheSeconds != 0) { jedis.expire(key, cacheSeconds); } logger.debug("set {} = {}", key, value); } catch (Exception e) { logger.warn("set {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 設置緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public String setObject(String key, Object value, int cacheSeconds) { String result = null; Jedis jedis = null; try { jedis = getResource(); result = jedis.set(getBytesKey(key), toBytes(value)); if (cacheSeconds != 0) { jedis.expire(key, cacheSeconds); } logger.debug("setObject {} = {}", key, value); } catch (Exception e) { logger.warn("setObject {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 獲取List緩存 * @param key 鍵 * @return 值 */ public List<String> getList(String key) { List<String> value = null; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(key)) { value = jedis.lrange(key, 0, -1); logger.debug("getList {} = {}", key, value); } } catch (Exception e) { logger.warn("getList {} = {}", key, value, e); } finally { returnResource(jedis); } return value; } /** * 獲取List緩存 * @param key 鍵 * @return 值 */ public List<Object> getObjectList(String key) { List<Object> value = null; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(getBytesKey(key))) { List<byte[]> list = jedis.lrange(getBytesKey(key), 0, -1); value = Lists.newArrayList(); for (byte[] bs : list){ value.add(toObject(bs)); } logger.debug("getObjectList {} = {}", key, value); } } catch (Exception e) { logger.warn("getObjectList {} = {}", key, value, e); } finally { returnResource(jedis); } return value; } /** * 設置List緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public long setList(String key, List<String> value, int cacheSeconds) { long result = 0; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(key)) { jedis.del(key); } result = jedis.rpush(key, (String[])value.toArray()); if (cacheSeconds != 0) { jedis.expire(key, cacheSeconds); } logger.debug("setList {} = {}", key, value); } catch (Exception e) { logger.warn("setList {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 設置List緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public long setObjectList(String key, List<Object> value, int cacheSeconds) { long result = 0; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(getBytesKey(key))) { jedis.del(key); } List<byte[]> list = Lists.newArrayList(); for (Object o : value){ list.add(toBytes(o)); } result = jedis.rpush(getBytesKey(key), (byte[][])list.toArray()); if (cacheSeconds != 0) { jedis.expire(key, cacheSeconds); } logger.debug("setObjectList {} = {}", key, value); } catch (Exception e) { logger.warn("setObjectList {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 向List緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public long listAdd(String key, String... value) { long result = 0; Jedis jedis = null; try { jedis = getResource(); result = jedis.rpush(key, value); logger.debug("listAdd {} = {}", key, value); } catch (Exception e) { logger.warn("listAdd {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 向List緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public long listObjectAdd(String key, Object... value) { long result = 0; Jedis jedis = null; try { jedis = getResource(); List<byte[]> list = Lists.newArrayList(); for (Object o : value){ list.add(toBytes(o)); } result = jedis.rpush(getBytesKey(key), (byte[][])list.toArray()); logger.debug("listObjectAdd {} = {}", key, value); } catch (Exception e) { logger.warn("listObjectAdd {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 獲取緩存 * @param key 鍵 * @return 值 */ public Set<String> getSet(String key) { Set<String> value = null; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(key)) { value = jedis.smembers(key); logger.debug("getSet {} = {}", key, value); } } catch (Exception e) { logger.warn("getSet {} = {}", key, value, e); } finally { returnResource(jedis); } return value; } /** * 獲取緩存 * @param key 鍵 * @return 值 */ public Set<Object> getObjectSet(String key) { Set<Object> value = null; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(getBytesKey(key))) { value = Sets.newHashSet(); Set<byte[]> set = jedis.smembers(getBytesKey(key)); for (byte[] bs : set){ value.add(toObject(bs)); } logger.debug("getObjectSet {} = {}", key, value); } } catch (Exception e) { logger.warn("getObjectSet {} = {}", key, value, e); } finally { returnResource(jedis); } return value; } /** * 設置Set緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public long setSet(String key, Set<String> value, int cacheSeconds) { long result = 0; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(key)) { jedis.del(key); } result = jedis.sadd(key, (String[])value.toArray()); if (cacheSeconds != 0) { jedis.expire(key, cacheSeconds); } logger.debug("setSet {} = {}", key, value); } catch (Exception e) { logger.warn("setSet {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 設置Set緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public long setObjectSet(String key, Set<Object> value, int cacheSeconds) { long result = 0; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(getBytesKey(key))) { jedis.del(key); } Set<byte[]> set = Sets.newHashSet(); for (Object o : value){ set.add(toBytes(o)); } result = jedis.sadd(getBytesKey(key), (byte[][])set.toArray()); if (cacheSeconds != 0) { jedis.expire(key, cacheSeconds); } logger.debug("setObjectSet {} = {}", key, value); } catch (Exception e) { logger.warn("setObjectSet {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 向Set緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public long setSetAdd(String key, String... value) { long result = 0; Jedis jedis = null; try { jedis = getResource(); result = jedis.sadd(key, value); logger.debug("setSetAdd {} = {}", key, value); } catch (Exception e) { logger.warn("setSetAdd {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 向Set緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public long setSetObjectAdd(String key, Object... value) { long result = 0; Jedis jedis = null; try { jedis = getResource(); Set<byte[]> set = Sets.newHashSet(); for (Object o : value){ set.add(toBytes(o)); } result = jedis.rpush(getBytesKey(key), (byte[][])set.toArray()); logger.debug("setSetObjectAdd {} = {}", key, value); } catch (Exception e) { logger.warn("setSetObjectAdd {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 獲取Map緩存 * @param key 鍵 * @return 值 */ public Map<String, String> getMap(String key) { Map<String, String> value = null; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(key)) { value = jedis.hgetAll(key); logger.debug("getMap {} = {}", key, value); } } catch (Exception e) { logger.warn("getMap {} = {}", key, value, e); } finally { returnResource(jedis); } return value; } /** * 獲取Map緩存 * @param key 鍵 * @return 值 */ public Map<String, Object> getObjectMap(String key) { Map<String, Object> value = null; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(getBytesKey(key))) { value = Maps.newHashMap(); Map<byte[], byte[]> map = jedis.hgetAll(getBytesKey(key)); for (Map.Entry<byte[], byte[]> e : map.entrySet()){ value.put(StringUtils.toString(e.getKey()), toObject(e.getValue())); } logger.debug("getObjectMap {} = {}", key, value); } } catch (Exception e) { logger.warn("getObjectMap {} = {}", key, value, e); } finally { returnResource(jedis); } return value; } /** * 設置Map緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public String setMap(String key, Map<String, String> value, int cacheSeconds) { String result = null; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(key)) { jedis.del(key); } result = jedis.hmset(key, value); if (cacheSeconds != 0) { jedis.expire(key, cacheSeconds); } logger.debug("setMap {} = {}", key, value); } catch (Exception e) { logger.warn("setMap {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 設置Map緩存 * @param key 鍵 * @param value 值 * @param cacheSeconds 超時時間,0爲不超時 * @return */ public String setObjectMap(String key, Map<String, Object> value, int cacheSeconds) { String result = null; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(getBytesKey(key))) { jedis.del(key); } Map<byte[], byte[]> map = Maps.newHashMap(); for (Map.Entry<String, Object> e : value.entrySet()){ map.put(getBytesKey(e.getKey()), toBytes(e.getValue())); } result = jedis.hmset(getBytesKey(key), (Map<byte[], byte[]>)map); if (cacheSeconds != 0) { jedis.expire(key, cacheSeconds); } logger.debug("setObjectMap {} = {}", key, value); } catch (Exception e) { logger.warn("setObjectMap {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 向Map緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public String mapPut(String key, Map<String, String> value) { String result = null; Jedis jedis = null; try { jedis = getResource(); result = jedis.hmset(key, value); logger.debug("mapPut {} = {}", key, value); } catch (Exception e) { logger.warn("mapPut {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 向Map緩存中添加值 * @param key 鍵 * @param value 值 * @return */ public String mapObjectPut(String key, Map<String, Object> value) { String result = null; Jedis jedis = null; try { jedis = getResource(); Map<byte[], byte[]> map = Maps.newHashMap(); for (Map.Entry<String, Object> e : value.entrySet()){ map.put(getBytesKey(e.getKey()), toBytes(e.getValue())); } result = jedis.hmset(getBytesKey(key), (Map<byte[], byte[]>)map); logger.debug("mapObjectPut {} = {}", key, value); } catch (Exception e) { logger.warn("mapObjectPut {} = {}", key, value, e); } finally { returnResource(jedis); } return result; } /** * 移除Map緩存中的值 * @param key 鍵 * @param value 值 * @return */ public long mapRemove(String key, String mapKey) { long result = 0; Jedis jedis = null; try { jedis = getResource(); result = jedis.hdel(key, mapKey); logger.debug("mapRemove {} {}", key, mapKey); } catch (Exception e) { logger.warn("mapRemove {} {}", key, mapKey, e); } finally { returnResource(jedis); } return result; } /** * 移除Map緩存中的值 * @param key 鍵 * @param value 值 * @return */ public long mapObjectRemove(String key, String mapKey) { long result = 0; Jedis jedis = null; try { jedis = getResource(); result = jedis.hdel(getBytesKey(key), getBytesKey(mapKey)); logger.debug("mapObjectRemove {} {}", key, mapKey); } catch (Exception e) { logger.warn("mapObjectRemove {} {}", key, mapKey, e); } finally { returnResource(jedis); } return result; } /** * 判斷Map緩存中的Key是否存在 * @param key 鍵 * @param value 值 * @return */ public boolean mapExists(String key, String mapKey) { boolean result = false; Jedis jedis = null; try { jedis = getResource(); result = jedis.hexists(key, mapKey); logger.debug("mapExists {} {}", key, mapKey); } catch (Exception e) { logger.warn("mapExists {} {}", key, mapKey, e); } finally { returnResource(jedis); } return result; } /** * 判斷Map緩存中的Key是否存在 * @param key 鍵 * @param value 值 * @return */ public boolean mapObjectExists(String key, String mapKey) { boolean result = false; Jedis jedis = null; try { jedis = getResource(); result = jedis.hexists(getBytesKey(key), getBytesKey(mapKey)); logger.debug("mapObjectExists {} {}", key, mapKey); } catch (Exception e) { logger.warn("mapObjectExists {} {}", key, mapKey, e); } finally { returnResource(jedis); } return result; } /** * 刪除緩存 * @param key 鍵 * @return */ public long del(String key) { long result = 0; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(key)){ result = jedis.del(key); logger.debug("del {}", key); }else{ logger.debug("del {} not exists", key); } } catch (Exception e) { logger.warn("del {}", key, e); } finally { returnResource(jedis); } return result; } /** * 刪除緩存 * @param key 鍵 * @return */ public long delObject(String key) { long result = 0; Jedis jedis = null; try { jedis = getResource(); if (jedis.exists(getBytesKey(key))){ result = jedis.del(getBytesKey(key)); logger.debug("delObject {}", key); }else{ logger.debug("delObject {} not exists", key); } } catch (Exception e) { logger.warn("delObject {}", key, e); } finally { returnResource(jedis); } return result; } /** * 緩存是否存在 * @param key 鍵 * @return */ public boolean exists(String key) { boolean result = false; Jedis jedis = null; try { jedis = getResource(); result = jedis.exists(key); logger.debug("exists {}", key); } catch (Exception e) { logger.warn("exists {}", key, e); } finally { returnResource(jedis); } return result; } /** * 緩存是否存在 * @param key 鍵 * @return */ public boolean existsObject(String key) { boolean result = false; Jedis jedis = null; try { jedis = getResource(); result = jedis.exists(getBytesKey(key)); logger.debug("existsObject {}", key); } catch (Exception e) { logger.warn("existsObject {}", key, e); } finally { returnResource(jedis); } return result; } /** * 獲取資源 * @return * @throws JedisException */ public Jedis getResource() throws JedisException { Jedis jedis = null; try { jedis = jedisPool.getResource(); // logger.debug("getResource.", jedis); } catch (JedisException e) { logger.warn("getResource.", e); returnBrokenResource(jedis); throw e; } return jedis; } /** * 歸還資源 * @param jedis * @param isBroken */ public void returnBrokenResource(Jedis jedis) { if (jedis != null) { jedisPool.returnBrokenResource(jedis); } } /** * 釋放資源 * @param jedis * @param isBroken */ public void returnResource(Jedis jedis) { if (jedis != null) { jedisPool.returnResource(jedis); } } /** * 獲取byte[]類型Key * @param key * @return */ public static byte[] getBytesKey(Object object){ if(object instanceof String){ return StringUtils.getBytes((String)object); }else{ return ObjectUtils.serialize(object); } } /** * Object轉換byte[]類型 * @param key * @return */ public static byte[] toBytes(Object object){ return ObjectUtils.serialize(object); } /** * byte[]型轉換Object * @param key * @return */ public static Object toObject(byte[] bytes){ return ObjectUtils.unserialize(bytes); } }
JedisClusterClient
/** * 集羣方式redis客戶端操做 * @author jimmywu * */ @Service public class JedisClusterClient implements IJedisClient { private Logger logger = LoggerFactory.getLogger(JedisClusterClient.class); @Autowired private JedisCluster jedisCluster ; // public final String KEY_PREFIX = Global.getConfig("redis.keyPrefix"); /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#get(java.lang.String) */ @Override public String get(String key) { String value = null; try { if (jedisCluster.exists(key)) { value = jedisCluster.get(key); value = StringUtils.isNotBlank(value) && !"nil".equalsIgnoreCase(value) ? value : null; logger.debug("get {} = {}", key, value); } } catch (Exception e) { logger.warn("get {} = {}", key, value, e); } finally { // returnResource(jedis); } return value; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#getObject(java.lang.String) */ @Override public Object getObject(String key) { Object value = null; try { if (jedisCluster.exists(getBytesKey(key))) { value = toObject(jedisCluster.get(getBytesKey(key))); logger.debug("getObject {} = {}", key, value); } } catch (Exception e) { logger.warn("getObject {} = {}", key, value, e); } finally { //returnResource(jedis); // try { // jedisCluster.close(); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } return value; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#set(java.lang.String, java.lang.String, int) */ @Override public String set(String key, String value, int cacheSeconds) { String result = null; try { result = jedisCluster.set(key, value); if (cacheSeconds != 0) { jedisCluster.expire(key, cacheSeconds); } logger.debug("set {} = {}", key, value); } catch (Exception e) { logger.warn("set {} = {}", key, value, e); } finally { //returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#setObject(java.lang.String, java.lang.Object, int) */ @Override public String setObject(String key, Object value, int cacheSeconds) { String result = null; try { result = jedisCluster.set(getBytesKey(key), toBytes(value)); if (cacheSeconds != 0) { jedisCluster.expire(key, cacheSeconds); } logger.debug("setObject {} = {}", key, value); } catch (Exception e) { logger.warn("setObject {} = {}", key, value, e); } finally { //returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#getList(java.lang.String) */ @Override public List<String> getList(String key) { List<String> value = null; try { if (jedisCluster.exists(key)) { value = jedisCluster.lrange(key, 0, -1); logger.debug("getList {} = {}", key, value); } } catch (Exception e) { logger.warn("getList {} = {}", key, value, e); } finally { //returnResource(jedis); } return value; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#getObjectList(java.lang.String) */ @Override public List<Object> getObjectList(String key) { List<Object> value = null; try { if (jedisCluster.exists(getBytesKey(key))) { List<byte[]> list = jedisCluster.lrange(getBytesKey(key), 0, -1); value = Lists.newArrayList(); for (byte[] bs : list){ value.add(toObject(bs)); } logger.debug("getObjectList {} = {}", key, value); } } catch (Exception e) { logger.warn("getObjectList {} = {}", key, value, e); } finally { //returnResource(jedis); } return value; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#setList(java.lang.String, java.util.List, int) */ @Override public long setList(String key, List<String> value, int cacheSeconds) { long result = 0; try { if (jedisCluster.exists(key)) { jedisCluster.del(key); } result = jedisCluster.rpush(key, (String[])value.toArray()); if (cacheSeconds != 0) { jedisCluster.expire(key, cacheSeconds); } logger.debug("setList {} = {}", key, value); } catch (Exception e) { logger.warn("setList {} = {}", key, value, e); } finally { //returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#setObjectList(java.lang.String, java.util.List, int) */ @Override public long setObjectList(String key, List<Object> value, int cacheSeconds) { long result = 0; try { if (jedisCluster.exists(getBytesKey(key))) { jedisCluster.del(key); } List<byte[]> list = Lists.newArrayList(); for (Object o : value){ list.add(toBytes(o)); } result = jedisCluster.rpush(getBytesKey(key), (byte[][])list.toArray()); if (cacheSeconds != 0) { jedisCluster.expire(key, cacheSeconds); } logger.debug("setObjectList {} = {}", key, value); } catch (Exception e) { logger.warn("setObjectList {} = {}", key, value, e); } finally { //returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#listAdd(java.lang.String, java.lang.String) */ @Override public long listAdd(String key, String... value) { long result = 0; try { result = jedisCluster.rpush(key, value); logger.debug("listAdd {} = {}", key, value); } catch (Exception e) { logger.warn("listAdd {} = {}", key, value, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#listObjectAdd(java.lang.String, java.lang.Object) */ @Override public long listObjectAdd(String key, Object... value) { long result = 0; try { List<byte[]> list = Lists.newArrayList(); for (Object o : value){ list.add(toBytes(o)); } result = jedisCluster.rpush(getBytesKey(key), (byte[][])list.toArray()); logger.debug("listObjectAdd {} = {}", key, value); } catch (Exception e) { logger.warn("listObjectAdd {} = {}", key, value, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#getSet(java.lang.String) */ @Override public Set<String> getSet(String key) { Set<String> value = null; try { if (jedisCluster.exists(key)) { value = jedisCluster.smembers(key); logger.debug("getSet {} = {}", key, value); } } catch (Exception e) { logger.warn("getSet {} = {}", key, value, e); } finally { // returnResource(jedis); } return value; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#getObjectSet(java.lang.String) */ @Override public Set<Object> getObjectSet(String key) { Set<Object> value = null; try { if (jedisCluster.exists(getBytesKey(key))) { value = Sets.newHashSet(); Set<byte[]> set = jedisCluster.smembers(getBytesKey(key)); for (byte[] bs : set){ value.add(toObject(bs)); } logger.debug("getObjectSet {} = {}", key, value); } } catch (Exception e) { logger.warn("getObjectSet {} = {}", key, value, e); } finally { // returnResource(jedis); } return value; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#setSet(java.lang.String, java.util.Set, int) */ @Override public long setSet(String key, Set<String> value, int cacheSeconds) { long result = 0; try { if (jedisCluster.exists(key)) { jedisCluster.del(key); } result = jedisCluster.sadd(key, (String[])value.toArray()); if (cacheSeconds != 0) { jedisCluster.expire(key, cacheSeconds); } logger.debug("setSet {} = {}", key, value); } catch (Exception e) { logger.warn("setSet {} = {}", key, value, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#setObjectSet(java.lang.String, java.util.Set, int) */ @Override public long setObjectSet(String key, Set<Object> value, int cacheSeconds) { long result = 0; try { if (jedisCluster.exists(getBytesKey(key))) { jedisCluster.del(key); } Set<byte[]> set = Sets.newHashSet(); for (Object o : value){ set.add(toBytes(o)); } result = jedisCluster.sadd(getBytesKey(key), (byte[][])set.toArray()); if (cacheSeconds != 0) { jedisCluster.expire(key, cacheSeconds); } logger.debug("setObjectSet {} = {}", key, value); } catch (Exception e) { logger.warn("setObjectSet {} = {}", key, value, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#setSetAdd(java.lang.String, java.lang.String) */ @Override public long setSetAdd(String key, String... value) { long result = 0; try { result = jedisCluster.sadd(key, value); logger.debug("setSetAdd {} = {}", key, value); } catch (Exception e) { logger.warn("setSetAdd {} = {}", key, value, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#setSetObjectAdd(java.lang.String, java.lang.Object) */ @Override public long setSetObjectAdd(String key, Object... value) { long result = 0; try { Set<byte[]> set = Sets.newHashSet(); for (Object o : value){ set.add(toBytes(o)); } result = jedisCluster.rpush(getBytesKey(key), (byte[][])set.toArray()); logger.debug("setSetObjectAdd {} = {}", key, value); } catch (Exception e) { logger.warn("setSetObjectAdd {} = {}", key, value, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#getMap(java.lang.String) */ @Override public Map<String, String> getMap(String key) { Map<String, String> value = null; try { if (jedisCluster.exists(key)) { value = jedisCluster.hgetAll(key); logger.debug("getMap {} = {}", key, value); } } catch (Exception e) { logger.warn("getMap {} = {}", key, value, e); } finally { // returnResource(jedis); } return value; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#getObjectMap(java.lang.String) */ @Override public Map<String, Object> getObjectMap(String key) { Map<String, Object> value = null; try { if (jedisCluster.exists(getBytesKey(key))) { value = Maps.newHashMap(); Map<byte[], byte[]> map = jedisCluster.hgetAll(getBytesKey(key)); for (Map.Entry<byte[], byte[]> e : map.entrySet()){ value.put(StringUtils.toString(e.getKey()), toObject(e.getValue())); } logger.debug("getObjectMap {} = {}", key, value); } } catch (Exception e) { logger.warn("getObjectMap {} = {}", key, value, e); } finally { } return value; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#setMap(java.lang.String, java.util.Map, int) */ @Override public String setMap(String key, Map<String, String> value, int cacheSeconds) { String result = null; try { if (jedisCluster.exists(key)) { jedisCluster.del(key); } result = jedisCluster.hmset(key, value); if (cacheSeconds != 0) { jedisCluster.expire(key, cacheSeconds); } logger.debug("setMap {} = {}", key, value); } catch (Exception e) { logger.warn("setMap {} = {}", key, value, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#setObjectMap(java.lang.String, java.util.Map, int) */ @Override public String setObjectMap(String key, Map<String, Object> value, int cacheSeconds) { String result = null; try { if (jedisCluster.exists(getBytesKey(key))) { jedisCluster.del(key); } Map<byte[], byte[]> map = Maps.newHashMap(); for (Map.Entry<String, Object> e : value.entrySet()){ map.put(getBytesKey(e.getKey()), toBytes(e.getValue())); } result = jedisCluster.hmset(getBytesKey(key), (Map<byte[], byte[]>)map); if (cacheSeconds != 0) { jedisCluster.expire(key, cacheSeconds); } logger.debug("setObjectMap {} = {}", key, value); } catch (Exception e) { logger.warn("setObjectMap {} = {}", key, value, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#mapPut(java.lang.String, java.util.Map) */ @Override public String mapPut(String key, Map<String, String> value) { String result = null; try { result = jedisCluster.hmset(key, value); logger.debug("mapPut {} = {}", key, value); } catch (Exception e) { logger.warn("mapPut {} = {}", key, value, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#mapObjectPut(java.lang.String, java.util.Map) */ @Override public String mapObjectPut(String key, Map<String, Object> value) { String result = null; try { Map<byte[], byte[]> map = Maps.newHashMap(); for (Map.Entry<String, Object> e : value.entrySet()){ map.put(getBytesKey(e.getKey()), toBytes(e.getValue())); } result = jedisCluster.hmset(getBytesKey(key), (Map<byte[], byte[]>)map); logger.debug("mapObjectPut {} = {}", key, value); } catch (Exception e) { logger.warn("mapObjectPut {} = {}", key, value, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#mapRemove(java.lang.String, java.lang.String) */ @Override public long mapRemove(String key, String mapKey) { long result = 0; try { result = jedisCluster.hdel(key, mapKey); logger.debug("mapRemove {} {}", key, mapKey); } catch (Exception e) { logger.warn("mapRemove {} {}", key, mapKey, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#mapObjectRemove(java.lang.String, java.lang.String) */ @Override public long mapObjectRemove(String key, String mapKey) { long result = 0; try { result = jedisCluster.hdel(getBytesKey(key), getBytesKey(mapKey)); logger.debug("mapObjectRemove {} {}", key, mapKey); } catch (Exception e) { logger.warn("mapObjectRemove {} {}", key, mapKey, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#mapExists(java.lang.String, java.lang.String) */ @Override public boolean mapExists(String key, String mapKey) { boolean result = false; try { result = jedisCluster.hexists(key, mapKey); logger.debug("mapExists {} {}", key, mapKey); } catch (Exception e) { logger.warn("mapExists {} {}", key, mapKey, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#mapObjectExists(java.lang.String, java.lang.String) */ @Override public boolean mapObjectExists(String key, String mapKey) { boolean result = false; try { result = jedisCluster.hexists(getBytesKey(key), getBytesKey(mapKey)); logger.debug("mapObjectExists {} {}", key, mapKey); } catch (Exception e) { logger.warn("mapObjectExists {} {}", key, mapKey, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#del(java.lang.String) */ @Override public long del(String key) { long result = 0; try { if (jedisCluster.exists(key)){ result = jedisCluster.del(key); logger.debug("del {}", key); }else{ logger.debug("del {} not exists", key); } } catch (Exception e) { logger.warn("del {}", key, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#delObject(java.lang.String) */ @Override public long delObject(String key) { long result = 0; try { if (jedisCluster.exists(getBytesKey(key))){ result = jedisCluster.del(getBytesKey(key)); logger.debug("delObject {}", key); }else{ logger.debug("delObject {} not exists", key); } } catch (Exception e) { logger.warn("delObject {}", key, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#exists(java.lang.String) */ @Override public boolean exists(String key) { boolean result = false; try { result = jedisCluster.exists(key); logger.debug("exists {}", key); } catch (Exception e) { logger.warn("exists {}", key, e); } finally { // returnResource(jedis); } return result; } /* (non-Javadoc) * @see com.jeeplus.common.redis.IJedisClient#existsObject(java.lang.String) */ @Override public boolean existsObject(String key) { boolean result = false; try { result = jedisCluster.exists(getBytesKey(key)); logger.debug("existsObject {}", key); } catch (Exception e) { logger.warn("existsObject {}", key, e); } finally { // returnResource(jedis); } return result; } /** * 獲取byte[]類型Key * @param key * @return */ public static byte[] getBytesKey(Object object){ if(object instanceof String){ return StringUtils.getBytes((String)object); }else{ return ObjectUtils.serialize(object); } } /** * Object轉換byte[]類型 * @param key * @return */ public static byte[] toBytes(Object object){ return ObjectUtils.serialize(object); } /** * byte[]型轉換Object * @param key * @return */ public static Object toObject(byte[] bytes){ return ObjectUtils.unserialize(bytes); } }
JedisClusterFactory
/** * * @author jimmywu * */ public class JedisClusterFactory implements FactoryBean<JedisCluster>, InitializingBean { //鏈接池參數 spring 注入 private GenericObjectPoolConfig genericObjectPoolConfig; // private JedisCluster jedisCluster; private int connectionTimeout = 2000; private int soTimeout = 3000; private int maxRedirections = 5; //redis結點列表 spring注入 private Set<String> jedisClusterNodes; @Override public void afterPropertiesSet() throws Exception { //判斷地址是否爲空 if(jedisClusterNodes == null || jedisClusterNodes.size() == 0){ throw new NullPointerException("jedisClusterNodes is null."); } //構造結點 Set<HostAndPort> haps = new HashSet<HostAndPort>(); for(String node:jedisClusterNodes){ String[] arr = node.split(":"); if(arr.length != 2){ throw new ParseException("node address error!", node.length()-1); } haps.add(new HostAndPort(arr[0],Integer.valueOf(arr[1]))); } jedisCluster = new JedisCluster(haps, connectionTimeout, soTimeout, maxRedirections, genericObjectPoolConfig); } @Override public JedisCluster getObject() throws Exception { return jedisCluster; } @Override public Class<?> getObjectType() { return (this.jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class); } @Override public boolean isSingleton() { // TODO Auto-generated method stub return true; } public GenericObjectPoolConfig getGenericObjectPoolConfig() { return genericObjectPoolConfig; } public void setGenericObjectPoolConfig( GenericObjectPoolConfig genericObjectPoolConfig) { this.genericObjectPoolConfig = genericObjectPoolConfig; } public JedisCluster getJedisCluster() { return jedisCluster; } public void setJedisCluster(JedisCluster jedisCluster) { this.jedisCluster = jedisCluster; } public int getConnectionTimeout() { return connectionTimeout; } public void setConnectionTimeout(int connectionTimeout) { this.connectionTimeout = connectionTimeout; } public int getSoTimeout() { return soTimeout; } public void setSoTimeout(int soTimeout) { this.soTimeout = soTimeout; } public int getMaxRedirections() { return maxRedirections; } public void setMaxRedirections(int maxRedirections) { this.maxRedirections = maxRedirections; } public Set<String> getJedisClusterNodes() { return jedisClusterNodes; } public void setJedisClusterNodes(Set<String> jedisClusterNodes) { this.jedisClusterNodes = jedisClusterNodes; } }
RedisOperate
/** * 操做redis時真正使用的類 * 具體鏈接方式由spring注入的客戶端類型決定 * @author jimmywu * */ public class RedisOperate implements IJedisClient { IJedisClient jedisClient; public IJedisClient getJedisClient() { return jedisClient; } public void setJedisClient(IJedisClient jedisClient) { this.jedisClient = jedisClient; } @Override public String get(String key) { return jedisClient.get(key); } @Override public Object getObject(String key) { return jedisClient.getObject(key); } @Override public String set(String key, String value, int cacheSeconds) { return jedisClient.set(key, value, cacheSeconds); } @Override public String setObject(String key, Object value, int cacheSeconds) { return jedisClient.setObject(key, value, cacheSeconds); } @Override public List<String> getList(String key) { return jedisClient.getList(key); } @Override public List<Object> getObjectList(String key) { return jedisClient.getObjectList(key); } @Override public long setList(String key, List<String> value, int cacheSeconds) { return jedisClient.setList(key, value, cacheSeconds); } @Override public long setObjectList(String key, List<Object> value, int cacheSeconds) { return jedisClient.setObjectList(key, value, cacheSeconds); } @Override public long listAdd(String key, String... value) { return jedisClient.listAdd(key, value); } @Override public long listObjectAdd(String key, Object... value) { return jedisClient.listObjectAdd(key, value); } @Override public Set<String> getSet(String key) { return jedisClient.getSet(key); } @Override public Set<Object> getObjectSet(String key) { return jedisClient.getObjectSet(key); } @Override public long setSet(String key, Set<String> value, int cacheSeconds) { return jedisClient.setSet(key, value, cacheSeconds); } @Override public long setObjectSet(String key, Set<Object> value, int cacheSeconds) { return jedisClient.setObjectSet(key, value, cacheSeconds); } @Override public long setSetAdd(String key, String... value) { return jedisClient.setSetAdd(key, value); } @Override public long setSetObjectAdd(String key, Object... value) { return jedisClient.setSetObjectAdd(key, value); } @Override public Map<String, String> getMap(String key) { return jedisClient.getMap(key); } @Override public Map<String, Object> getObjectMap(String key) { return jedisClient.getObjectMap(key); } @Override public String setMap(String key, Map<String, String> value, int cacheSeconds) { return jedisClient.setMap(key, value, cacheSeconds); } @Override public String setObjectMap(String key, Map<String, Object> value, int cacheSeconds) { // TODO Auto-generated method stub return jedisClient.setObjectMap(key, value, cacheSeconds); } @Override public String mapPut(String key, Map<String, String> value) { // TODO Auto-generated method stub return jedisClient.mapPut(key, value); } @Override public String mapObjectPut(String key, Map<String, Object> value) { // TODO Auto-generated method stub return jedisClient.mapObjectPut(key, value); } @Override public long mapRemove(String key, String mapKey) { // TODO Auto-generated method stub return jedisClient.mapRemove(key, mapKey); } @Override public long mapObjectRemove(String key, String mapKey) { return jedisClient.mapObjectRemove(key, mapKey); } @Override public boolean mapExists(String key, String mapKey) { return jedisClient.mapExists(key, mapKey); } @Override public boolean mapObjectExists(String key, String mapKey) { return jedisClient.mapObjectExists(key, mapKey); } @Override public long del(String key) { return jedisClient.del(key); } @Override public long delObject(String key) { return jedisClient.delObject(key); } @Override public boolean exists(String key) { return jedisClient.exists(key); } @Override public boolean existsObject(String key) { return jedisClient.existsObject(key); } }