JedisHelper——Redis客戶端簡單封裝

由于公司在不同的業(yè)務(wù)系統(tǒng)場景都有用到Redis肘习,為了減少業(yè)務(wù)之間帶來的相互影響,所以部署了多個Redis集群,JedisHelper就提供了獲取不同業(yè)務(wù)集群Redis實例的方法披粟。

package com.ylp.utils;

import com.ylp.common.tools.utils.PropertiesUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author: 會跳舞的機器人
 * @date: 16/8/23 下午3:49
 * @description: Jedis客戶端
 */
public class JedisHelper {
    private static int JEDISPOOL_MAXTOTAL = 300;
    private static int JEDISPOOL_MAXAIDLE = 60;
    private static int TIMEOUT = 5000;

    private static Logger logger = Logger.getLogger(JedisHelper.class);

    /**
     * 各個Redis集群的IP端口信息集合
     */
    private static Map<String, Set<HostAndPort>> map = new HashMap<String, Set<HostAndPort>>();

    /**
     * 其他Redis實例集合,用于后續(xù)的擴展
     */
    private static Map<String, JedisCluster> jedisClusterMap = new ConcurrentHashMap<String, JedisCluster>();

    /**
     * Redis核心業(yè)務(wù)集群實例
     */
    private static JedisCluster coreJedis = null;

    /**
     * Redis數(shù)據(jù)集群實例
     */
    private static JedisCluster dataJedis = null;

    /**
     * 禁止實例化
     */
    private JedisHelper() {

    }

    /**
     * Redis集群配置信息初始化...
     */
    static {
        // step1:先獲取全部的Redis集群配置
        List<String> list = PropertiesUtil.getKeySet("redis.cluster");
        for (String str : list) {
            Set<HostAndPort> nodes = getHostAndPortSetByClusterName(str);
            map.put(str, nodes);
        }
        // step2:分別獲取核心集群與數(shù)據(jù)集群
        String coreCluseterValue = PropertiesUtil.getProperty("redis.coreCluster");
        String dataClusterValue = PropertiesUtil.getProperty("redis.dataCluster");
        map.put("redis.coreCluster", map.get(coreCluseterValue));
        map.put("redis.dataCluster", map.get(dataClusterValue));
        // step3:初始化核心業(yè)務(wù)集群實例
        Set<HostAndPort> coreNodes = map.get("redis.coreCluster");
        coreJedis = getJedisClusterByNodes(coreNodes);
        // step4:初始化Redis數(shù)據(jù)集群實例
        Set<HostAndPort> dataNodes = map.get("redis.dataCluster");
        dataJedis = getJedisClusterByNodes(dataNodes);
    }


    /**
     * 獲取Redis核心業(yè)務(wù)集群客戶端
     *
     * @return
     */
    public static JedisCluster coreCluster() {

        return coreJedis;
    }

    /**
     * 獲取Redis數(shù)據(jù)集群客戶端
     *
     * @return
     */
    public static JedisCluster dataCluster() {

        return dataJedis;
    }

    /**
     * 根據(jù)指定的clusterName獲取JedisCluster實例
     *
     * @param clusterName
     * @return
     */
    public synchronized static JedisCluster getCluster(String clusterName) {
        logger.info("clusterName:" + clusterName);
        if (StringUtils.isEmpty(clusterName)) {
            throw new IllegalArgumentException("clusterName不能為空");
        }
        Set<HostAndPort> hostAndPortSet = map.get(clusterName);
        if (hostAndPortSet == null) {
            throw new IllegalArgumentException("clusterName對應(yīng)的集群配置信息不存在");
        }
        // 如果已經(jīng)實例化,則直接返回
        if (jedisClusterMap.get(clusterName) != null) {
            return jedisClusterMap.get(clusterName);
        }
        // 根據(jù)集群名獲取集群IP端口信息
        Set<HostAndPort> nodes = map.get(clusterName);
        JedisCluster jedisCluster = getJedisClusterByNodes(nodes);
        // 實例化后放入jedisClusterMap
        jedisClusterMap.put(clusterName, jedisCluster);

        return jedisCluster;
    }

    /**
     * 根據(jù)集群節(jié)點nodes以及默認(rèn)的配置信息獲取JedisCluster
     *
     * @param nodes
     * @return
     */
    private static JedisCluster getJedisClusterByNodes(Set<HostAndPort> nodes) {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(JEDISPOOL_MAXTOTAL);
        config.setMaxIdle(JEDISPOOL_MAXAIDLE);
        // 根據(jù)集群名獲取集群IP端口信息
        JedisCluster jedisCluster = new JedisCluster(nodes, TIMEOUT, 100, config);
        return jedisCluster;
    }

    /**
     * 根據(jù)配置文件中的配置信息,獲取Set<HostAndPort>
     *
     * @param clusterName
     * @return
     */
    private static Set<HostAndPort> getHostAndPortSetByClusterName(String clusterName) {
        Set<HostAndPort> nodes = new HashSet<HostAndPort>();
        // 獲取配置信息
        String result = PropertiesUtil.getProperty(clusterName);
        if (StringUtils.isEmpty(result)) {
            return nodes;
        }
        // 解析
        String[] arry = result.split(" ");
        String host;
        String port;
        for (String str : arry) {
            host = str.substring(0, str.indexOf(":"));
            port = str.substring(str.indexOf(":") + 1);
            HostAndPort hostAndPort = new HostAndPort(host, Integer.valueOf(port));
            nodes.add(hostAndPort);
        }
        return nodes;
    }

}

配置信息格式:

# Redis核心業(yè)務(wù)集群
redis.coreCluster=redis.cluster1
# Redis數(shù)據(jù)集群
redis.dataCluster=redis.cluster2
redis.cluster1=172.16.8.161:7001 172.16.8.162:7002 172.16.8.163:7003 172.16.8.164:7004 172.16.8.165:7005 172.16.8.166:7006
redis.cluster2=172.16.8.161:7001 172.16.8.162:7002 172.16.8.163:7003 172.16.8.164:7004 172.16.8.165:7005 172.16.8.166:7006
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冷冗,隨后出現(xiàn)的幾起案子守屉,更是在濱河造成了極大的恐慌,老刑警劉巖蒿辙,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拇泛,死亡現(xiàn)場離奇詭異滨巴,居然都是意外死亡,警方通過查閱死者的電腦和手機俺叭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門兢卵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绪颖,你說我怎么就攤上這事√鹧伲” “怎么了柠横?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長课兄。 經(jīng)常有香客問我牍氛,道長,這世上最難降的妖魔是什么烟阐? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任搬俊,我火速辦了婚禮,結(jié)果婚禮上蜒茄,老公的妹妹穿的比我還像新娘唉擂。我一直安慰自己,他們只是感情好檀葛,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布玩祟。 她就那樣靜靜地躺著,像睡著了一般屿聋。 火紅的嫁衣襯著肌膚如雪空扎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天润讥,我揣著相機與錄音转锈,去河邊找鬼。 笑死楚殿,一個胖子當(dāng)著我的面吹牛撮慨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勒魔,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼甫煞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冠绢?” 一聲冷哼從身側(cè)響起抚吠,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弟胀,沒想到半個月后楷力,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喊式,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年萧朝,在試婚紗的時候發(fā)現(xiàn)自己被綠了岔留。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡检柬,死狀恐怖献联,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情何址,我是刑警寧澤里逆,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站用爪,受9級特大地震影響原押,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偎血,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一诸衔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颇玷,春花似錦笨农、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阿弃,卻和暖如春诊霹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渣淳。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工脾还, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人入愧。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓鄙漏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棺蛛。 傳聞我的和親對象是個殘疾皇子怔蚌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容