關於jedis2.4以上版本的連接池配置,及工具類


jedis.propertise 注意以前版本的maxAcitve和maxWait有所改變,JVM根據系統環境變量ServerType中的值 取不同的配置,實現多環境(測試環境、生產環境)集成。

redis.pool.maxTotal=redis.pool.maxActive.${ServerType}
redis.pool.maxIdle=redis.pool.maxIdle.${ServerType}
redis.pool.maxWaitMillis=redis.pool.maxWait.${ServerType}
redis.pool.minIdle=redis.pool.minIdle.${ServerType}
redis.host=redis.host.${ServerType}
redis.port=redis.port.${ServerType}
redis.password=redis.password.${ServerType}
redis.pool.testOnBorrow=true
redis.pool.testOnReturn=true
redis.timeout=1000
#C
#REL
redis.pool.maxActive.REL=200
redis.pool.maxIdle.REL=50
redis.pool.minIdle.REL=10
redis.pool.maxWait.REL=300
redis.host.REL=192.168.0.201
redis.port.REL=8989
redis.password.REL=beidou123

#VRF
redis.pool.maxActive.VRF=200
redis.pool.maxIdle.VRF=50
redis.pool.minIdle.VRF=10
redis.pool.maxWait.VRF=300
redis.host.VRF=192.168.0.201
redis.port.VRF=8989
redis.password.VRF=beidou123

config的包裝便於后面xml的注入

/**
 * redis連接池配置文件包裝類
 *
 * @author daxiong
 *         date: 2017/03/07 11:51
 */
public class GenericObjectPoolConfigWrapper extends GenericObjectPoolConfig {

    public GenericObjectPoolConfig getConfig() {
        return this;
    }

}

 

spring配置

<!--redis連接池配置-->
    <context:property-placeholder location="classpath:jedis.properties" ignore-unresolvable="true"/>
    <bean id="jedisPoolConfig" class="smm.mvc.CacheDb.GenericObjectPoolConfigWrapper">
        <!--最大連接數-->
        <property name="maxTotal" value="${${redis.pool.maxTotal}}" />
        <!--最大空閑連接數-->
        <property name="maxIdle" value="${${redis.pool.maxIdle}}" />
        <!--初始化連接數-->
        <property name="minIdle" value="${${redis.pool.minIdle}}"/>
        <!--最大等待時間-->
        <property name="maxWaitMillis" value="${${redis.pool.maxWaitMillis}}" />
        <!--對拿到的connection進行validateObject校驗-->
        <property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
        <!--在進行returnObject對返回的connection進行validateObject校驗-->
        <property name="testOnReturn" value="${redis.pool.testOnReturn}" />
        <!--定時對線程池中空閑的鏈接進行validateObject校驗-->
        <property name="testWhileIdle" value="true" />
    </bean>

    <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
        <constructor-arg index="0">
            <bean factory-bean="jedisPoolConfig" factory-method="getConfig"/>
        </constructor-arg>
        <constructor-arg index="1" value="${${redis.host}}"/>
        <constructor-arg index="2" value="${${redis.port}}"/>
        <!--timeout-->
        <constructor-arg index="3" value="${redis.timeout}"/>
        <constructor-arg index="4" value="${${redis.password}}"/>
    </bean>

 

jedis工具類

ublic abstract class JCacheTools {
    public abstract int getDBIndex();
    /**
     * 默認日志打印logger_default
     */
    public static Logger logger_default = Logger.getLogger("logger_jCache_default");
    /**
     * 失敗日志logger,用於定期del指定的key
     */
    public static Logger logger_failure = Logger.getLogger("logger_jCache_failure");

    @Resource
    protected JedisPool jedisPool;

    protected Jedis getJedis() throws JedisException {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
        } catch (JedisException e) {
            LogContext.instance().warn(logger_failure, "failed:jedisPool getResource.", e);
            if(jedis!=null){
                jedisPool.returnBrokenResource(jedis);
            }
            throw e;
        }
        return jedis;
    }

    protected void release(Jedis jedis, boolean isBroken) {
        if (jedis != null) {
            if (isBroken) {
                jedisPool.returnBrokenResource(jedis);
            } else {
                jedisPool.returnResource(jedis);
            }
        }
    }

    protected String addStringToJedis(String key, String value, int cacheSeconds, String methodName) {
        Jedis jedis = null;
        boolean isBroken = false;
        String lastVal = null;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            lastVal = jedis.getSet(key, value);
            if(cacheSeconds!=0){
                jedis.expire(key,cacheSeconds);
            }
            LogContext.instance().debug(logger_default, "succeed:" + methodName, key, value);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, value, e);
        } finally {
            release(jedis, isBroken);
        }
        return lastVal;
    }

    protected void addStringToJedis(Map<String,String> batchData, int cacheSeconds, String methodName) {
        Jedis jedis = null;
        boolean isBroken = false;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            Pipeline pipeline = jedis.pipelined();
            for(Map.Entry<String,String> element:batchData.entrySet()){
                if(cacheSeconds!=0){
                    pipeline.setex(element.getKey(),cacheSeconds,element.getValue());
                }else{
                    pipeline.set(element.getKey(),element.getValue());
                }
            }
            pipeline.sync();
            LogContext.instance().debug(logger_default, "succeed:" + methodName,batchData.size());
        } catch (Exception e) {
            isBroken = true;
            e.printStackTrace();
        } finally {
            release(jedis, isBroken);
        }
    }

    protected void addListToJedis(String key, List<String> list, int cacheSeconds, String methodName) {
        if (list != null && list.size() > 0) {
            Jedis jedis = null;
            boolean isBroken = false;
            try {
                jedis = this.getJedis();
                jedis.select(getDBIndex());
                if (jedis.exists(key)) {
                    jedis.del(key);
                }
                for (String aList : list) {
                    jedis.rpush(key, aList);
                }
                if(cacheSeconds!=0){
                    jedis.expire(key, cacheSeconds);
                }
                LogContext.instance().debug(logger_default, "succeed:" + methodName, key, list.size());
            } catch (JedisException e) {
                isBroken = true;
                LogContext.instance().warn(logger_failure, "failed:" + methodName, key, list.size(), e);
            } catch (Exception e) {
                isBroken = true;
                LogContext.instance().warn(logger_failure, "failed:" + methodName, key, list.size(), e);
            } finally {
                release(jedis, isBroken);
            }
        }
    }

    protected void addToSetJedis(String key, String[] value, String methodName) {
        Jedis jedis = null;
        boolean isBroken = false;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            jedis.sadd(key,value);
            LogContext.instance().debug(logger_default, "succeed:" + methodName, key, value);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, value, e);
        } finally {
            release(jedis, isBroken);
        }
    }

    protected void removeSetJedis(String key,String value, String methodName) {
        Jedis jedis = null;
        boolean isBroken = false;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            jedis.srem(key,value);
            LogContext.instance().debug(logger_default, "succeed:" + methodName, key, value);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, value, e);
        } finally {
            release(jedis, isBroken);
        }
    }

    protected void pushDataToListJedis(String key, String data, int cacheSeconds, String methodName) {
        Jedis jedis = null;
        boolean isBroken = false;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            jedis.rpush(key, data);
            if(cacheSeconds!=0){
                jedis.expire(key,cacheSeconds);
            }
            LogContext.instance().debug(logger_default, "succeed:" + methodName, key, data);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, data, e);
        } finally {
            release(jedis, isBroken);
        }
    }
    protected void pushDataToListJedis(String key,List<String> batchData, int cacheSeconds, String methodName) {
        Jedis jedis = null;
        boolean isBroken = false;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            jedis.del(key);
            jedis.lpush(key,batchData.toArray(new String[batchData.size()]));
            if(cacheSeconds!=0)
                jedis.expire(key,cacheSeconds);
            LogContext.instance().debug(logger_default, "succeed:" + methodName,batchData!=null?batchData.size():0);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, batchData!=null?batchData.size():0, e);
        } finally {
            release(jedis, isBroken);
        }
    }

    /**
     * 刪除list中的元素
     * @param key
     * @param values
     * @param methodName
     */
    protected void deleteDataFromListJedis(String key,List<String> values, String methodName) {
        Jedis jedis = null;
        boolean isBroken = false;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            Pipeline pipeline = jedis.pipelined();
            if(values!=null && !values.isEmpty()){
                for (String val:values){
                    pipeline.lrem(key,0,val);
                }
            }
            pipeline.sync();
            LogContext.instance().debug(logger_default, "succeed:" + methodName,values!=null?values.size():0);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, values!=null?values.size():0, e);
        } finally {
            release(jedis, isBroken);
        }
    }

    protected void addHashMapToJedis(String key, Map<String, String> map, int cacheSeconds, boolean isModified, String methodName) {
        boolean isBroken = false;
        Jedis jedis = null;
        if (map != null && map.size() > 0) {
            try {
                jedis = this.getJedis();
                jedis.select(getDBIndex());
                jedis.hmset(key, map);
                if (cacheSeconds >= 0)
                    jedis.expire(key, cacheSeconds);
                LogContext.instance().debug(logger_default, "succeed:" + methodName, key, map.size());
            } catch (Exception e) {
                isBroken = true;
                LogContext.instance().warn(logger_failure, "failed:" + methodName, key, map.size(), e);
            } finally {
                release(jedis, isBroken);
            }
        }
    }

    protected void addHashMapToJedis(String key, String field, String value, int cacheSeconds, String methodName) {
        boolean isBroken = false;
        Jedis jedis = null;
        try {
            jedis = this.getJedis();
            if (jedis != null) {
                jedis.select(getDBIndex());
                jedis.hset(key, field, value);
                jedis.expire(key, cacheSeconds);
                LogContext.instance().debug(logger_default, "succeed:" + methodName, key, field, value);
            }
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, field, value, e);
        }finally {
            release(jedis, isBroken);
        }
    }

    protected void updateHashMapToJedis(String key, String incrementField, long incrementValue, String dateField, String dateValue, String methodName) {
        boolean isBroken = false;
        Jedis jedis = null;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            jedis.hincrBy(key, incrementField, incrementValue);
            jedis.hset(key, dateField, dateValue);
            LogContext.instance().debug(logger_default, "succeed:" + methodName, key, incrementField, incrementValue);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, incrementField, incrementValue, e);
        }finally {
            release(jedis, isBroken);
        }
    }

    public String getStringFromJedis(String key, String methodName) {
        String value = null;
        Jedis jedis = null;
        boolean isBroken = false;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            if (jedis.exists(key)) {
                value = jedis.get(key);
                value = StringUtils.isNotBlank(value) && !"nil".equalsIgnoreCase(value)?value:null;
                LogContext.instance().debug(logger_default, "succeed:" + methodName, key, value);
            }
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, value, e);
        } finally {
            release(jedis, isBroken);
        }
        return value;
    }

    public List<String> getStringFromJedis(String[] keys, String methodName) {
        Jedis jedis = null;
        boolean isBroken = false;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            return jedis.mget(keys);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, Arrays.toString(keys), e);
        } finally {
            release(jedis, isBroken);
        }
        return null;
    }

    protected List<String> getListFromJedis(String key, String methodName) throws JMSCacheException {
        List<String> list = null;
        boolean isBroken = false;
        Jedis jedis = null;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            if (jedis.exists(key)) {
                list = jedis.lrange(key, 0, -1);
                LogContext.instance().debug(logger_default, "succeed:" + methodName, key, list != null ? list.size() : 0);
            }
        } catch (JedisException e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, list != null ? list.size() : 0, e);
        } finally {
            release(jedis, isBroken);
        }
        return list;
    }

    protected Set<String> getSetFromJedis(String key, String methodName) throws JMSCacheException {
        Set<String> list = null;
        boolean isBroken = false;
        Jedis jedis = null;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            if (jedis.exists(key)) {
                list = jedis.smembers(key);
                LogContext.instance().debug(logger_default, "succeed:" + methodName, key, list != null ? list.size() : 0);
            }
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, list != null ? list.size() : 0, e);
        } finally {
            release(jedis, isBroken);
        }
        return list;
    }

    protected Map<String, String> getHashMapFromJedis(String key, String methodName) {
        Map<String, String> hashMap = null;
        boolean isBroken = false;
        Jedis jedis = null;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            hashMap = jedis.hgetAll(key);
            LogContext.instance().debug(logger_default, "succeed:" + methodName, key, hashMap != null ? hashMap.size() : 0);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, hashMap != null ? hashMap.size() : 0, e);
        } finally {
            release(jedis, isBroken);
        }
        return hashMap;
    }

    protected String getHashMapValueFromJedis(String key, String field, String methodName) {
        String value = null;
        boolean isBroken = false;
        Jedis jedis = null;
        try {
            jedis = this.getJedis();
            if (jedis != null) {
                jedis.select(getDBIndex());
                if (jedis.exists(key)) {
                    value = jedis.hget(key, field);
                    LogContext.instance().debug(logger_default, "succeed:" + methodName, key, field, value);
                }
            }
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, key, field, value, e);
        } finally {
            release(jedis, isBroken);
        }
        return value;
    }

    public Long getIdentifyId(String identifyName ,String methodName) {
        boolean isBroken = false;
        Jedis jedis = null;
        Long identify=null;
        try {
            jedis = this.getJedis();
            if (jedis != null) {
                jedis.select(getDBIndex());
                identify = jedis.incr(identifyName);
                if(identify==0){
                    return jedis.incr(identifyName);
                }else {
                    return identify;
                }
            }
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:" + methodName, identifyName, "", identify, e);
        } finally {
            release(jedis, isBroken);
        }
        return null;
    }


    /**
     * 刪除某db的某個key值
     * @param key
     * @return
     */
    public Long delKeyFromJedis(String key) {
        boolean isBroken = false;
        Jedis jedis = null;
        long result = 0;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            LogContext.instance().debug(logger_default, "succeed:delKeyFromJedis");
            return jedis.del(key);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:delKeyFromJedis", e);
        } finally {
            release(jedis, isBroken);
        }
        return result;
    }

    /**
     * 根據dbIndex flushDB每個shard
     *
     * @param dbIndex
     */
    public void flushDBFromJedis(int dbIndex) {
        Jedis jedis = null;
        boolean isBroken = false;
        try {
            jedis = this.getJedis();
            jedis.select(dbIndex);
            jedis.flushDB();
            LogContext.instance().debug(logger_default, "succeed:flushDBFromJedis");
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:flushDBFromJedis", e);
        } finally {
            release(jedis, isBroken);
        }
    }

    public boolean existKey(String key, String methodName) {
        Jedis jedis = null;
        boolean isBroken = false;
        try {
            jedis = this.getJedis();
            jedis.select(getDBIndex());
            LogContext.instance().debug(logger_default, "succeed:"+methodName);
            return jedis.exists(key);
        } catch (Exception e) {
            isBroken = true;
            LogContext.instance().warn(logger_failure, "failed:"+methodName, e);
        } finally {
            release(jedis, isBroken);
        }
        return false;
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM