All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bytegriffin.get4j.store.RedisStorage Maven / Gradle / Ivy

The newest version!
package com.bytegriffin.get4j.store;

import java.util.List;
import java.util.Set;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.bytegriffin.get4j.core.Initializer;
import com.bytegriffin.get4j.core.UrlQueue;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

/**
 * Redis负责分布式存储Url
 */
public class RedisStorage extends Initializer {

	private static final Logger logger = LogManager.getLogger(RedisStorage.class);

	private static final String host_split = ",";
	private static final int default_port = 6379;

	private static RedisStorage redisStorage;
	
	public static Jedis jedis;
	public static ShardedJedis sharedJedis;
	public static JedisCluster jedisCluster;

	private String redisMode;
	private String redisAddress;
	private String redisAuth;

	public RedisStorage(String redisMode, String redisAddress, String redisAuth) {
		this.redisMode = redisMode;
		this.redisAddress = redisAddress;
		this.redisAuth = redisAuth;
		redisStorage = this;
	}

	@Override
	public void init() {
		if (Strings.isNullOrEmpty(redisMode) || Strings.isNullOrEmpty(redisAddress)) {
			logger.error("分布式环境下组件RedisStorage在初始化时参数为空。");
			System.exit(1);
		}
		if ("standalone".equalsIgnoreCase(redisMode)) {
			standalone(redisAddress, redisAuth);
		} else if ("sharded".equalsIgnoreCase(redisMode)) {
			sharded(redisAddress, redisAuth);
		} else if ("cluster".equalsIgnoreCase(redisMode)) {
			cluster(redisAddress, redisAuth);
		}
		UrlQueue.registerRedisQueue(new RedisQueue());
		logger.info("分布式环境下组件RedisStorage的初始化完成。");
	}

	private static JedisPoolConfig config() {
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxTotal(1000);
		config.setMaxIdle(5);
		config.setMinIdle(1);
		config.setBlockWhenExhausted(true);
		config.setMaxWaitMillis(60 * 1000);
		config.setTestOnBorrow(true);
		config.setTestOnReturn(true);
		config.setTestWhileIdle(true);
		config.setTimeBetweenEvictionRunsMillis(60 * 1000);
		return config;
	}

	/**
	 * 单机
	 * @param address 地址
	 * @param password 密码,可以为空
	 */
	private void standalone(String address, String password) {
		String firstAddress = Splitter.on(host_split).trimResults().split(address).iterator().next();
		List list = Splitter.on(":").trimResults().splitToList(firstAddress);
		String host = "";
		Integer port = null;
		if (list.size() == 1) {
			host = Strings.isNullOrEmpty(list.get(0)) ? null : list.get(0);
			port = default_port;
		} else if (list.size() == 2) {
			host = Strings.isNullOrEmpty(list.get(0)) ? null : list.get(0);
			port = Strings.isNullOrEmpty(list.get(1)) ? null : Integer.valueOf(list.get(1));
		} else {
			logger.error("分布式环境下组件RedisStorage在standalone模式下初始化时发现redis地址格式有问题:{}", address);
			System.exit(1);
		}
		JedisPool jedisPool = null;
		try {
			if (Strings.isNullOrEmpty(password)) {
				jedisPool = new JedisPool(config(), host, port);
			} else {
				jedisPool = new JedisPool(config(), host, port, 2000, password);
			}
			jedis = jedisPool.getResource();
		} catch (Exception e) {
			logger.error("分布式环境下的组件RedisStorage在standalone模式下初始化链接失败。", e);
			System.exit(1);
		}
	}

	/**
	 * 分片 客户端集群
	 * @param addresses 地址集合,用逗号隔开
	 * @param password 密码,可以为空
	 */
	private void sharded(String addresses, String password) {
		List list = Splitter.on(host_split).trimResults().splitToList(addresses);
		List shards = Lists.newArrayList();
		for (String addr : list) {
			List hostAndPort = Splitter.on(":").trimResults().splitToList(addr);
			if (hostAndPort.size() == 1) {
				JedisShardInfo node = new JedisShardInfo(hostAndPort.get(0), default_port);
				if (!Strings.isNullOrEmpty(password)) {
					node.setPassword(password);
				}
				shards.add(node);
			} else if (hostAndPort.size() == 2) {
				JedisShardInfo node = new JedisShardInfo(hostAndPort.get(0), Integer.valueOf(hostAndPort.get(1)));
				if (!Strings.isNullOrEmpty(password)) {
					node.setPassword(password);
				}
				shards.add(node);
			}
		}
		if (shards == null || shards.isEmpty()) {
			logger.error("分布式环境下组件RedisStorage在Sharded模式下初始化时发现redis地址格式有问题。");
			System.exit(1);
		}
		ShardedJedisPool shardedJedisPool = null;
		try {
			shardedJedisPool = new ShardedJedisPool(config(), shards);
			sharedJedis = shardedJedisPool.getResource();
		} catch (Exception e) {
			logger.error("分布式环境下组件RedisStorage在Sharded模式下初始化链接失败。", e);
			System.exit(1);
		}
	}

	/**
	 * 集群 redis 3以上支持cluster
	 * @param addresses 地址集合,用逗号隔开
	 * @param password 密码,可以为空
	 */
	private void cluster(String addresses, String password) {
		List list = Splitter.on(host_split).trimResults().splitToList(addresses);
		Set clusterNodes = Sets.newHashSet();
		for (String addr : list) {
			List hostAndPort = Splitter.on(":").trimResults().splitToList(addr);
			if (hostAndPort.size() == 1) {
				clusterNodes.add(new HostAndPort(hostAndPort.get(0), default_port));
			} else if (hostAndPort.size() == 2) {
				clusterNodes.add(new HostAndPort(hostAndPort.get(0), Integer.valueOf(hostAndPort.get(1))));
			}
		}
		if (clusterNodes == null || clusterNodes.isEmpty()) {
			logger.error("分布式环境下组件RedisStorage在Cluster模式下初始化时发现redis地址格式有问题。");
			System.exit(1);
		}

		try {
			if (Strings.isNullOrEmpty(redisStorage.redisAuth)) {
				jedisCluster = new JedisCluster(clusterNodes, 2000, 2000, 5, config());
			} else {
				jedisCluster = new JedisCluster(clusterNodes, 2000, 2000, 5, redisStorage.redisAuth,
						config());
			}
		} catch (Exception e) {
			logger.error("分布式环境下组件RedisStorage在Cluster模式下初始化链接失败。", e);
			System.exit(1);
		} 
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy