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

org.tinygroup.jedis.shard.TinyShardJedis Maven / Gradle / Ivy

There is a newer version: 2.2.3
Show newest version
package org.tinygroup.jedis.shard;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.regex.Pattern;

import org.tinygroup.jedis.util.JedisUtil;
import org.tinygroup.logger.LogLevel;
import org.tinygroup.logger.Logger;
import org.tinygroup.logger.LoggerFactory;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ScanResult;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.Tuple;
import redis.clients.util.Hashing;

public class TinyShardJedis extends ShardedJedis {
	private final static Logger LOGGER = LoggerFactory
			.getLogger(TinyShardJedis.class);
	private Map> readMap = new HashMap>();
	
	
	private boolean writeState = false;

	/**
	 * 
	 * @param shards
	 *            列表中的实例必须是TinyJedisShardInfo
	 * @param algo
	 * @param keyTagPattern
	 */
	public TinyShardJedis(List shards, Hashing algo,
			Pattern keyTagPattern) {
		super(shards, algo, keyTagPattern);
		LOGGER.logMessage(LogLevel.DEBUG,
				"创建TinyShardJedis:JedisShardInfo长度为:{}", shards.size());
		for (JedisShardInfo info : shards) {
			if (info instanceof TinyJedisShardInfo) {
				TinyJedisShardInfo tinyJedis = (TinyJedisShardInfo) info;
				readMap.put(tinyJedis, tinyJedis.createAllReadResource());
			} else {
				throw new RuntimeException(
						"TinyShardJedis构造函数传入的JedisShardInfo必须是TinyJedisShardInfo");
			}
		}
		

	}

	public Jedis getShard(String key) {
		writeState = true;
		return super.getShard(key);
	}

	public Jedis getReadShard(String key) {
		if (writeState) {
			return getShard(key);
		}
		TinyJedisShardInfo info = (TinyJedisShardInfo) super.getShardInfo(key);
		List currentlist = readMap.get(info);
		List failList = JedisCheck.getFailList(info);
		List list = JedisUtil.newList(currentlist, failList);
		return JedisUtil.choose(list, failList);
	}

	public void resetWriteState() {
		writeState = false;
	}

	public Collection getAllReadShards() {
		List totalList = new ArrayList();
		for (List list : readMap.values()) {
			totalList.addAll(list);
		}
		return totalList;
	}

	public Map> getReadShardsMap() {
		return readMap;
	}

	public Collection getAllShards() {
		return super.getAllShards();
	}

	// private List getValiableJedis(List list){
	// List newList = new ArrayList();
	// for(Jedis j:list){
	// try {
	// j.connect();
	// newList.add(j);
	// } catch (JedisConnectionException ex) {
	// LOGGER.logMessage(LogLevel.WARN, "jedis连接失败:{}",j.clientGetname());
	// }
	// }
	// return newList;
	// }

	public void close() {
		super.close();
		
		for (List list : readMap.values()) {
			for (Jedis jedis : list) {
				jedis.close();
			}
		}
	}

	public String get(String key) {
		Jedis j = getReadShard(key);
		return j.get(key);
	}

	public String echo(String string) {
		Jedis j = getReadShard(string);
		return j.echo(string);
	}

	public Boolean exists(String key) {
		Jedis j = getReadShard(key);
		return j.exists(key);
	}

	public String type(String key) {
		Jedis j = getReadShard(key);
		return j.type(key);
	}

	public Long ttl(String key) {
		Jedis j = getReadShard(key);
		return j.ttl(key);
	}

	public Boolean getbit(String key, long offset) {
		Jedis j = getReadShard(key);
		return j.getbit(key, offset);
	}

	public String getrange(String key, long startOffset, long endOffset) {
		Jedis j = getReadShard(key);
		return j.getrange(key, startOffset, endOffset);
	}

	public String getSet(String key, String value) {
		Jedis j = getReadShard(key);
		return j.getSet(key, value);
	}

	// TODO:check
	public List blpop(String arg) {
		Jedis j = getReadShard(arg);
		return j.blpop(arg);
	}

	public List blpop(int timeout, String key) {
		Jedis j = getReadShard(key);
		return j.blpop(timeout, key);
	}

	public List brpop(String arg) {
		Jedis j = getReadShard(arg);
		return j.brpop(arg);
	}

	public List brpop(int timeout, String key) {
		Jedis j = getReadShard(key);
		return j.brpop(timeout, key);
	}

	public String substr(String key, int start, int end) {
		Jedis j = getReadShard(key);
		return j.substr(key, start, end);
	}

	public String hget(String key, String field) {
		Jedis j = getReadShard(key);
		return j.hget(key, field);
	}

	public List hmget(String key, String... fields) {
		Jedis j = getReadShard(key);
		return j.hmget(key, fields);
	}

	public Boolean hexists(String key, String field) {
		Jedis j = getReadShard(key);
		return j.hexists(key, field);
	}

	public Long hlen(String key) {
		Jedis j = getReadShard(key);
		return j.hlen(key);
	}

	public Set hkeys(String key) {
		Jedis j = getReadShard(key);
		return j.hkeys(key);
	}

	public List hvals(String key) {
		Jedis j = getReadShard(key);
		return j.hvals(key);
	}

	public Map hgetAll(String key) {
		Jedis j = getReadShard(key);
		return j.hgetAll(key);
	}

	public Long strlen(final String key) {
		Jedis j = getReadShard(key);
		return j.strlen(key);
	}

	public Long llen(String key) {
		Jedis j = getReadShard(key);
		return j.llen(key);
	}

	public List lrange(String key, long start, long end) {
		Jedis j = getReadShard(key);
		return j.lrange(key, start, end);
	}

	// check
	// ltrim(String key, long start, long end)
	public String lindex(String key, long index) {
		Jedis j = getReadShard(key);
		return j.lindex(key, index);
	}

	public Set smembers(String key) {
		Jedis j = getReadShard(key);
		return j.smembers(key);
	}

	public Long scard(String key) {
		Jedis j = getReadShard(key);
		return j.scard(key);
	}

	public Boolean sismember(String key, String member) {
		Jedis j = getReadShard(key);
		return j.sismember(key, member);
	}

	public String srandmember(String key) {
		Jedis j = getReadShard(key);
		return j.srandmember(key);
	}

	public List srandmember(String key, int count) {
		Jedis j = getReadShard(key);
		return j.srandmember(key, count);
	}

	public Set zrange(String key, long start, long end) {
		Jedis j = getReadShard(key);
		return j.zrange(key, start, end);
	}

	public Long zrank(String key, String member) {
		Jedis j = getReadShard(key);
		return j.zrank(key, member);
	}

	public Long zrevrank(String key, String member) {
		Jedis j = getReadShard(key);
		return j.zrevrank(key, member);
	}

	public Set zrevrange(String key, long start, long end) {
		Jedis j = getReadShard(key);
		return j.zrevrange(key, start, end);
	}

	public Set zrangeWithScores(String key, long start, long end) {
		Jedis j = getReadShard(key);
		return j.zrangeWithScores(key, start, end);
	}

	public Set zrevrangeWithScores(String key, long start, long end) {
		Jedis j = getReadShard(key);
		return j.zrevrangeWithScores(key, start, end);
	}

	public Long zcard(String key) {
		Jedis j = getReadShard(key);
		return j.zcard(key);
	}

	public Double zscore(String key, String member) {
		Jedis j = getReadShard(key);
		return j.zscore(key, member);
	}

	public Long zcount(String key, double min, double max) {
		Jedis j = getReadShard(key);
		return j.zcount(key, min, max);
	}

	public Long zcount(String key, String min, String max) {
		Jedis j = getReadShard(key);
		return j.zcount(key, min, max);
	}

	public Set zrangeByScore(String key, double min, double max) {
		Jedis j = getReadShard(key);
		return j.zrangeByScore(key, min, max);
	}

	public Set zrevrangeByScore(String key, double max, double min) {
		Jedis j = getReadShard(key);
		return j.zrevrangeByScore(key, max, min);
	}

	public Set zrangeByScore(String key, double min, double max,
			int offset, int count) {
		Jedis j = getReadShard(key);
		return j.zrangeByScore(key, min, max, offset, count);
	}

	public Set zrevrangeByScore(String key, double max, double min,
			int offset, int count) {
		Jedis j = getReadShard(key);
		return j.zrevrangeByScore(key, max, min, offset, count);
	}

	public Set zrangeByScoreWithScores(String key, double min, double max) {
		Jedis j = getReadShard(key);
		return j.zrangeByScoreWithScores(key, min, max);
	}

	public Set zrevrangeByScoreWithScores(String key, double max,
			double min) {
		Jedis j = getReadShard(key);
		return j.zrevrangeByScoreWithScores(key, max, min);
	}

	public Set zrangeByScoreWithScores(String key, double min,
			double max, int offset, int count) {
		Jedis j = getReadShard(key);
		return j.zrangeByScoreWithScores(key, min, max, offset, count);
	}

	public Set zrevrangeByScoreWithScores(String key, double max,
			double min, int offset, int count) {
		Jedis j = getReadShard(key);
		return j.zrevrangeByScoreWithScores(key, max, min, offset, count);
	}

	public Set zrangeByScore(String key, String min, String max) {
		Jedis j = getReadShard(key);
		return j.zrangeByScore(key, min, max);
	}

	public Set zrevrangeByScore(String key, String max, String min) {
		Jedis j = getReadShard(key);
		return j.zrevrangeByScore(key, max, min);
	}

	public Set zrangeByScore(String key, String min, String max,
			int offset, int count) {
		Jedis j = getReadShard(key);
		return j.zrangeByScore(key, min, max, offset, count);
	}

	public Set zrevrangeByScore(String key, String max, String min,
			int offset, int count) {
		Jedis j = getReadShard(key);
		return j.zrevrangeByScore(key, max, min, offset, count);
	}

	public Set zrangeByScoreWithScores(String key, String min, String max) {
		Jedis j = getReadShard(key);
		return j.zrangeByScoreWithScores(key, min, max);
	}

	public Set zrevrangeByScoreWithScores(String key, String max,
			String min) {
		Jedis j = getReadShard(key);
		return j.zrevrangeByScoreWithScores(key, max, min);
	}

	public Set zrangeByScoreWithScores(String key, String min,
			String max, int offset, int count) {
		Jedis j = getReadShard(key);
		return j.zrangeByScoreWithScores(key, min, max, offset, count);
	}

	public Set zrevrangeByScoreWithScores(String key, String max,
			String min, int offset, int count) {
		Jedis j = getReadShard(key);
		return j.zrevrangeByScoreWithScores(key, max, min, offset, count);
	}

	public Long zlexcount(final String key, final String min, final String max) {
		return getReadShard(key).zlexcount(key, min, max);
	}

	@Override
	public Set zrangeByLex(final String key, final String min,
			final String max) {
		return getReadShard(key).zrangeByLex(key, min, max);
	}

	@Override
	public Set zrangeByLex(final String key, final String min,
			final String max, final int offset, final int count) {
		return getReadShard(key).zrangeByLex(key, min, max, offset, count);
	}

	@Override
	public Set zrevrangeByLex(String key, String max, String min) {
		return getReadShard(key).zrevrangeByLex(key, max, min);
	}

	@Override
	public Set zrevrangeByLex(String key, String max, String min,
			int offset, int count) {
		return getReadShard(key).zrevrangeByLex(key, max, min, offset, count);
	}

	public Long bitcount(final String key) {
		Jedis j = getReadShard(key);
		return j.bitcount(key);
	}

	public Long bitcount(final String key, long start, long end) {
		Jedis j = getReadShard(key);
		return j.bitcount(key, start, end);
	}

	@Deprecated
	/**
	 * This method is deprecated due to bug (scan cursor should be unsigned long)
	 * And will be removed on next major release
	 * @see https://github.com/xetorthio/jedis/issues/531 
	 */
	public ScanResult> hscan(String key, int cursor) {
		Jedis j = getReadShard(key);
		return j.hscan(key, cursor);
	}

	@Deprecated
	/**
	 * This method is deprecated due to bug (scan cursor should be unsigned long)
	 * And will be removed on next major release
	 * @see https://github.com/xetorthio/jedis/issues/531 
	 */
	public ScanResult sscan(String key, int cursor) {
		Jedis j = getReadShard(key);
		return j.sscan(key, cursor);
	}

	@Deprecated
	/**
	 * This method is deprecated due to bug (scan cursor should be unsigned long)
	 * And will be removed on next major release
	 * @see https://github.com/xetorthio/jedis/issues/531 
	 */
	public ScanResult zscan(String key, int cursor) {
		Jedis j = getReadShard(key);
		return j.zscan(key, cursor);
	}

	public ScanResult> hscan(String key,
			final String cursor) {
		Jedis j = getReadShard(key);
		return j.hscan(key, cursor);
	}

	public ScanResult sscan(String key, final String cursor) {
		Jedis j = getReadShard(key);
		return j.sscan(key, cursor);
	}

	public ScanResult zscan(String key, final String cursor) {
		Jedis j = getReadShard(key);
		return j.zscan(key, cursor);
	}

	public long pfcount(String key) {
		Jedis j = getReadShard(key);
		return j.pfcount(key);
	}

	public void resetState() {
		super.resetState();
	}

	public Set keys(String keyPattern) {
		Set set = null;
		for (JedisShardInfo info : readMap.keySet()) {
			List list = readMap.get(info);
			List failList = JedisCheck.getFailList(info);
			Jedis jedis = JedisUtil.choose(list, failList);
			if (set == null) {
				set = jedis.keys(keyPattern);
			} else {
				set.addAll(jedis.keys(keyPattern));
			}
		}
		return set;
	}

	public void flushAll() {
		Collection jedisSet = getAllShards();
		for (Jedis jedis : jedisSet) {
			jedis.flushAll();
		}
	}

	public void flushDB() {
		Collection jedisSet = getAllShards();
		for (Jedis jedis : jedisSet) {
			jedis.flushDB();
		}
	}

	public int deleteMatchKey(String keyPattern) {
		Set keySet = this.keys(keyPattern);
		int delCount = 0;
		if (keySet != null && keySet.size() > 0) {
			for (String key : keySet) {
				delCount += this.del(key);
			}
		}
		return delCount;
	}

	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy