RedisClusterManagerUtil 工具类

RedisClusterManagerUtil 工具类

import java.io.IOException;
import java.io.PrintStream;
import java.io.Serializable;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
import org.apache.commons.lang.SerializationUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.log4j.Logger;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

public class RedisClusterManager {
	private final Logger _LOG = Logger.getLogger(RedisClusterManager.class);

	protected int DEFAULT_EXPIRED_TIME_SECONDS_OBJECT = 1296000;

	private static final RedisClusterManager _INSTANCE = new RedisClusterManager();

	private JedisCluster oCluster = null;

	private RedisClusterManager() {
		_init();
	}

	private void _init() {
		Set jedisClusterNodes = new HashSet();

		ResourceBundle oResBundle = null;
		try {
			oResBundle = ResourceBundle.getBundle("redis", Locale.CHINESE);
		} catch (Exception e) {
			this._LOG.warn("failed to load redis.properties : " + e.getMessage());
			return;
		}

		if (oResBundle == null) {
			return;
		}
		String sRedisCluster = null;
		String[] arrHostAndPort = null;
		if (oResBundle.containsKey("REDIS.CLUSTER")) {
			sRedisCluster = oResBundle.getString("REDIS.CLUSTER");
			if (!(StringUtil.isNullOrBlanks(sRedisCluster))) {
				arrHostAndPort = sRedisCluster.split("[\\s+\\;\\,]");
			}
		}
		if ((arrHostAndPort == null) || (arrHostAndPort.length <= 0)) {
			this._LOG.error("redis cluster host and port list must be specified.");
			return;
		}

		int iTempPort = 6379;
		String sTempHost = null;
		CallResult oIntResult = null;
		for (String item : arrHostAndPort) {
			if (!(StringUtil.isNullOrBlanks(item))) {
				String[] arrTemp = item.split("\\:");

				iTempPort = 6379;

				if (arrTemp.length > 0) {
					sTempHost = arrTemp[0];
				}

				if (arrTemp.length > 1) {
					oIntResult = StringUtil.str2int(arrTemp[1]);
					if (oIntResult.isSuccessful()) {
						iTempPort = ((Integer) oIntResult.getReturnedObject()).intValue();
					}
				}

				jedisClusterNodes.add(new HostAndPort(sTempHost, iTempPort));
			}
		}

		GenericObjectPoolConfig oConfig = new GenericObjectPoolConfig();

		oConfig.setMaxTotal(20);
		if (oResBundle.containsKey("REDIS.CONN.TOTAL")) {
			oIntResult = StringUtil.str2int(oResBundle.getString("REDIS.CONN.TOTAL"));
			if (oIntResult.isSuccessful()) {
				oConfig.setMaxTotal(((Integer) oIntResult.getReturnedObject()).intValue());
			}

		}

		oConfig.setMaxIdle(2);
		if (oResBundle.containsKey("REDIS.CONN.IDLE.MAX")) {
			oIntResult = StringUtil.str2int(oResBundle.getString("REDIS.CONN.IDLE.MAX"));
			if (oIntResult.isSuccessful()) {
				oConfig.setMaxIdle(((Integer) oIntResult.getReturnedObject()).intValue());
			}
		}

		oConfig.setTestWhileIdle(true);
		oConfig.setTestOnBorrow(true);
		oConfig.setTestOnReturn(false);

		if (oResBundle.containsKey("REDIS.DEFAULT.EXPIRE.SECONDS")) {
			oIntResult = StringUtil.str2int(oResBundle.getString("REDIS.DEFAULT.EXPIRE.SECONDS"));
			if (oIntResult.isSuccessful()) {
				this.DEFAULT_EXPIRED_TIME_SECONDS_OBJECT = ((Integer) oIntResult.getReturnedObject()).intValue();
			}

		}

		if (this.oCluster != null) {
			try {
				this.oCluster.close();
			} catch (IOException localIOException1) {
			}
			this._LOG.info("existed redis pool has been shutdown.");
		}

		this.oCluster = new JedisCluster(jedisClusterNodes, oConfig);
		this._LOG.info(String.format("redis cluster client is created on %s", new Object[]{sRedisCluster}));
	}

	public static final RedisClusterManager getInstance() {
		return _INSTANCE;
	}

	public boolean putString(String sKey, String sValue, int expiredInSeconds) {
		boolean result = false;

		if (StringUtil.isNullOrBlanks(sKey)) {
			return result;
		}

		if (this.oCluster != null) {
			this.oCluster.set(sKey, sValue);
			if (expiredInSeconds > 0) {
				this.oCluster.expire(sKey, expiredInSeconds);
			}

			result = true;
		}

		return result;
	}

	public boolean putString(String sKey, String sValue) {
		return putString(sKey, sValue, this.DEFAULT_EXPIRED_TIME_SECONDS_OBJECT);
	}

	public String getString(String sKey) {
		String result = null;
		if (StringUtil.isNullOrBlanks(sKey)) {
			return result;
		}

		if (this.oCluster != null) {
			result = this.oCluster.get(sKey);
		}

		return result;
	}

	public boolean putObject(String sKey, Serializable object, int expiredInSeconds) {
		boolean result = false;

		if (StringUtil.isNullOrBlanks(sKey)) {
			return result;
		}

		if (this.oCluster != null) {
			byte[] datas = SerializationUtils.serialize(object);
			byte[] arrKey = sKey.getBytes();

			this.oCluster.set(arrKey, datas);
			if (expiredInSeconds > 0) {
				this.oCluster.expire(arrKey, expiredInSeconds);
			}

			result = true;
		}

		return result;
	}

	public boolean putObject(String sKey, Serializable object) {
		return putObject(sKey, object, this.DEFAULT_EXPIRED_TIME_SECONDS_OBJECT);
	}

	public <T> T getObject(String sKey, Class<T> oclass) {
		Object result = null;
		if (StringUtil.isNullOrBlanks(sKey)) {
			return result;
		}

		if (this.oCluster != null) {
			byte[] arrKey = sKey.getBytes();

			byte[] datas = this.oCluster.get(arrKey);

			if ((datas != null) && (datas.length > 0)) {
				result = SerializationUtils.deserialize(datas);
			}
		}

		return result;
	}

	public boolean putMap(String sKey, Map<String, String> oMap, int expiredInSeconds) {
		boolean result = false;

		if ((StringUtil.isNullOrBlanks(sKey)) || (oMap == null) || (oMap.size() <= 0)) {
			return result;
		}

		if (this.oCluster != null) {
			this.oCluster.hmset(sKey, oMap);
			if (expiredInSeconds > 0) {
				this.oCluster.expire(sKey, expiredInSeconds);
			}

			result = true;
		}

		return result;
	}

	public boolean putMap(String sKey, Map<String, String> oMap) {
		return putMap(sKey, oMap, this.DEFAULT_EXPIRED_TIME_SECONDS_OBJECT);
	}

	public boolean putMap(String sKey, String sField, String sValue, int expiredInSeconds) {
		boolean result = false;

		if ((StringUtil.isNullOrBlanks(sKey)) || (StringUtil.isNullOrBlanks(sField))) {
			return result;
		}

		if (this.oCluster != null) {
			this.oCluster.hset(sKey, sField, sValue);
			if (expiredInSeconds > 0) {
				this.oCluster.expire(sKey, expiredInSeconds);
			}

			result = true;
		}

		return result;
	}

	public boolean putMap(String sKey, String sField, String sValue) {
		return putMap(sKey, sField, sValue, this.DEFAULT_EXPIRED_TIME_SECONDS_OBJECT);
	}

	public Map<String, String> getMap(String sKey) {
		Map result = null;
		if (StringUtil.isNullOrBlanks(sKey)) {
			return result;
		}

		if (this.oCluster != null) {
			result = this.oCluster.hgetAll(sKey);
		}

		return result;
	}

	public Map<String, String> getMap(String sKey, String[] fields) {
		Map result = null;

		Map mapAll = getMap(sKey);
		if ((mapAll != null) && (mapAll.size() > 0) && (fields != null) && (fields.length > 0)) {
			result = new LinkedHashMap();
			for (String field : fields) {
				result.put(field, mapAll.get(field));
			}

		}

		return result;
	}

	public boolean existsMapItem(String sKey, String sField) {
		if ((StringUtil.isNullOrBlanks(sKey)) || (StringUtil.isNullOrBlanks(sField))) {
			return false;
		}

		if (this.oCluster != null) {
			return this.oCluster.hexists(sKey, sField).booleanValue();
		}

		return false;
	}

	public boolean putMapValueAsObject(String sKey, String sField, Serializable oValue, int expiredInSeconds) {
		boolean result = false;

		if ((StringUtil.isNullOrBlanks(sKey)) || (StringUtil.isNullOrBlanks(sField))) {
			return result;
		}

		if (this.oCluster != null) {
			byte[] arrKey = sKey.getBytes();

			this.oCluster.hset(arrKey, sField.getBytes(), SerializationUtils.serialize(oValue));
			if (expiredInSeconds > 0) {
				this.oCluster.expire(arrKey, expiredInSeconds);
			}

			result = true;
		}

		return result;
	}

	public boolean putMapValueAsObject(String sKey, String sField, Serializable oValue) {
		return putMapValueAsObject(sKey, sField, oValue, this.DEFAULT_EXPIRED_TIME_SECONDS_OBJECT);
	}

	public <T> T getMapValueAsObject(String sKey, String sField, Class<T> oClass) {
		Object result = null;

		if ((StringUtil.isNullOrBlanks(sKey)) || (StringUtil.isNullOrBlanks(sField))) {
			return result;
		}

		if (this.oCluster != null) {
			byte[] datas = this.oCluster.hget(sKey.getBytes(), sField.getBytes());
			if ((datas != null) && (datas.length > 0)) {
				Object tmpObject = SerializationUtils.deserialize(datas);
				result = tmpObject;
			}
		}

		return result;
	}

	public void remove(String sKey) {
		if (StringUtil.isNullOrBlanks(sKey)) {
			return;
		}

		if (this.oCluster != null)
			this.oCluster.del(sKey);
	}

	public void close() {
		if (this.oCluster == null)
			return;
		try {
			this.oCluster.close();
		} catch (IOException localIOException) {
		}
	}

	public void restart() {
		_init();
	}

	public static void main(String[] args) {
		RedisClusterManager _MGR = getInstance();
		_MGR.putString("keya1", "wer", 3600);
		System.out.println(_MGR.getString("keya1"));
	}
}


redis-cluster-tool 是一个非常便利的 Redis 集群管理工具。help        Usage: redis-cluster-tool [-?hVds] [-v verbosity level] [-o output file]                  [-c conf file] [-a addr] [-i interval]                  [-p pid file] [-C command] [-r redis role]                  [-t thread number] [-b buffer size]    Options:      -h, --help             : this help      -V, --version          : show version and exit      -d, --daemonize        : run as a daemon      -s, --simple           : show the output not in detail      -v, --verbosity=N      : set logging level (default: 5, min: 0, max: 11)      -o, --output=S         : set logging file (default: stderr)      -c, --conf-file=S      : set configuration file (default: conf/rct.yml)      -a, --addr=S           : set redis cluster address (default: 127.0.0.1:6379)      -i, --interval=N       : set interval in msec (default: 1000 msec)      -p, --pid-file=S       : set pid file (default: off)      -C, --command=S        : set command to execute (default: cluster_state)      -r, --role=S           : set the role of the nodes that command to execute on (default: all, you can input: all, master or slave)      -t, --thread=N         : set how many threads to run the job(default: 8)      -b, --buffer=S         : set buffer size to run the job (default: 1048576 byte, unit:G/M/K)        Commands:        cluster_state                 :Show the cluster state.        cluster_used_memory           :Show the cluster used memory.        cluster_keys_num              :Show the cluster holds keys num.        slots_state                   :Show the slots state.        node_slot_num                 :Show the node hold slots number.        new_nodes_name                :Show the new nodes name that not covered slots.        cluster_rebalance             :Show the cluster how to rebalance.        flushall                      :Flush all the cluster.        cluster_config_get            :Get config from every node in the cluster and check consistency.        cluster_config_set            :Set config to every node in the cluster.        cluster_config_rewrite        :Rewrite every node config to echo node for the cluster.        node_list                     :List the nodes            del_keys                      :Delete keys in the cluster. The keys must match a given glob-style pattern.(This command not block the redis)ExampleGet the cluster state:        $redis-cluster-tool -a 127.0.0.1:34501 -C cluster_state -r master    master[127.0.0.1:34504] cluster_state is ok     master[127.0.0.1:34501] cluster_state is ok     master[127.0.0.1:34502] cluster_state is ok     master[127.0.0.1:34503] cluster_state is ok     all nodes cluster_state is ok    Get the cluster used memory:    $redis-cluster-tool -a 127.0.0.1:34501 -C cluster_used_memory -r master    master[127.0.0.1:34504] used 195 M 25%    master[127.0.0.1:34501] used 195 M 25%    master[127.0.0.1:34502] used 195 M 25%    master[127.0.0.1:34503] used 195 M 25%    cluster used 780 MRebalance the cluster slots:    $redis-cluster-tool -a 127.0.0.1:34501 -C cluster_rebalance    --from e1a4ba9922555bfc961f987213e3d4e6659c9316 --to 785862477453bc6b91765ffba0b5bc803052d70a --slots 2048    --from 437c719f50dc9d0745032f3b280ce7ecc40792ac --to cb8299390ce53cefb2352db34976dd768708bf64 --slots 2048    --from a497fc619d4f6c93bd4afb85f3f8a148a3f35adb --to a0cf6c1f12d295cd80f5811afab713cdc858ea30 --slots 2048    --from 0bdef694d08cb3daab9aac518d3ad6f8035ec896 --to 471eaf98ff43ba9a0aadd9579f5af1609239c5b7 --slots 2048Then you can use "redis-trib.rb reshard --yes --from e1a4ba9922555bfc961f987213e3d4e6659c9316 --to 785862477453bc6b91765ffba0b5bc803052d70a --slots 2048 127.0.0.1:34501" to rebalance the cluster slots     Flushall the cluster:    $redis-cluster-tool -a 127.0.0.1:34501 -C flushall -s    Do you really want to execute the "flushall"?    please input "yes" or "no" :        yes    OKGet a config from every node in cluster:    $redis-cluster-tool -a 127.0.0.1:34501 -C "cluster_config_get maxmemory" -r master    master[127.0.0.1:34501] config maxmemory is 1048576000 (1000MB)    master[127.0.0.1:34502] config maxmemory is 1048576000 (1000MB)    master[127.0.0.1:34503] config maxmemory is 1048576000 (1000MB)    master[127.0.0.1:34504] config maxmemory is 1048576000 (1000MB)    All nodes config are Consistent    cluster total maxmemory: 4194304000 (4000MB)Set a config from every node in cluster:    $redis-cluster-tool -a 127.0.0.1:34501 -C "cluster_config_set maxmemory 10000000" -s    Do you really want to execute the "cluster_config_set"?    please input "yes" or "no" :    yes        OKDelete keys in the cluster:    $redis-cluster-tool -a 127.0.0.1:34501 -C "del_keys abc*"    Do you really want to execute the "del_keys"?    please input "yes" or "no" :    yes    delete keys job is running...    delete keys job finished, deleted: 999999 keys, used: 4 s 标签:redis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值