1. 程式人生 > >Redis學習筆記-RedisCluster安裝部署和API使用

Redis學習筆記-RedisCluster安裝部署和API使用

1、Ruby安裝

$tar -xzvf ruby-2.2.4.tar.gz

$./configure

$make

$make install

2、Redis安裝

$tar -zxvf redis-3.2.3.tar.gz

$make && make install

3、Ruby和Redis的介面

$gem install redis 或 $gem install redis -v 3.3.3  線上

$gem install -l ./redis-3.3.1.gem  離線

4、新建目錄redis-3.2.3/cluster/6373、redis-3.2.3/cluster/6374、redis-3.2.3/cluster/6375、redis-3.2.3/cluster/6376、redis-3.2.3/cluster/6377、redis-3.2.3/cluster/6378、redis-3.2.3/pids、redis-3.2.3/dbs、redis-3.2.3/logs,修改相應的配置

​
bind 192.168.0.10
protected-mode yes
port 6373
tcp-backlog 511
timeout 300
tcp-keepalive 300
daemonize yes
supervised no
pidfile /home/user/Software/redis-3.2.3/pids/redis_6373.pid
loglevel notice
logfile /home/user/Software/redis-3.2.3/logs/redis_6373.log
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /home/user/Software/redis-3.2.3/dbs/6373
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
cluster-enabled yes
cluster-config-file /home/user/Software/redis-3.2.3/cluster/conf/nodes-6373.conf
cluster-node-timeout 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

​

5、啟動指令碼

#!/bin/bash

ps -ef|grep redis|awk '{print $2}'|xargs kill -9

rm -rf /home/user/Software/redis-3.2.3/dbs/6373/*
rm -rf /home/user/Software/redis-3.2.3/dbs/6374/*
rm -rf /home/user/Software/redis-3.2.3/dbs/6375/*
rm -rf /home/user/Software/redis-3.2.3/dbs/6376/*
rm -rf /home/user/Software/redis-3.2.3/dbs/6377/*
rm -rf /home/user/Software/redis-3.2.3/dbs/6378/*

rm -rf /home/user/Software/redis-3.2.3/cluster/conf/*

redis-server /home/user/Software/redis-3.2.3/cluster/6373/redis.conf
redis-server /home/user/Software/redis-3.2.3/cluster/6374/redis.conf
redis-server /home/user/Software/redis-3.2.3/cluster/6375/redis.conf
redis-server /home/user/Software/redis-3.2.3/cluster/6376/redis.conf
redis-server /home/user/Software/redis-3.2.3/cluster/6377/redis.conf
redis-server /home/user/Software/redis-3.2.3/cluster/6378/redis.conf

/home/user/Software/redis-3.2.3/src/redis-trib.rb create --replicas 1 192.168.0.10:6373 192.168.0.10:6374 192.168.0.10:6375 192.168.0.10:6376 192.168.0.10:6377 192.168.0.10:6378

$ redis-cli -c -h 192.168.0.10 -p 6373

192.168.0.10:6373> cluster info

192.168.0.10:6373> cluster nodes

6、異常問題處理記錄

jemalloc/jemalloc.h: No such file or directory

make MALLOC=libc

cannot load such file -- zlib

進入ruby原始碼資料夾,安裝ruby自身提供的zlib包

$cd ext/zlib

$ruby ./extconf.rb

$make

$make install

7、Java API 操作 Redis Cluster

#Redis Configuration
spring.redis.pool.maxActive=1024 
spring.redis.pool.maxWaitMillis=-1
spring.redis.pool.maxTotal=1000
spring.redis.pool.maxWait=1000    
spring.redis.pool.maxIdle=20    
spring.redis.pool.minIdle=10    
spring.redis.pool.testOnBorrow=true
spring.redis.pool.testOnReturn=true
spring.redis.pool.timeout=300000 
spring.redis.pool.minEvictableIdleTimeMillis=100000
spring.redis.pool.timeBetweenEvictionRunsMillis=100000

spring.redis.cluster.address=192.168.0.10:6373,192.168.0.10:6374,192.168.0.10:6375,192.168.0.10:6376,192.168.0.10:6377,192.168.0.10:6378
spring.redis.cluster.timeout=300000
spring.redis.cluster.maxRedirections=6
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.cisiondata.utils.redis.JedisClusterFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import redis.clients.jedis.Jedis;

@Configuration
@ConditionalOnClass({Jedis.class})
public class RedisConfiguration {

	private Logger LOG = LoggerFactory.getLogger(RedisConfiguration.class);
	
	@Bean
	@ConfigurationProperties(prefix = "spring.redis.pool")
	public GenericObjectPoolConfig genericObjectPoolConfig() {
		return new GenericObjectPoolConfig();
	}
	
	@Bean(name = "jedisCluster")
	@ConfigurationProperties(prefix = "spring.redis.cluster")
	public JedisClusterFactory jedisClusterFactory() {
		JedisClusterFactory jedisClusterFactory = new JedisClusterFactory();
		jedisClusterFactory.setGenericObjectPoolConfig(genericObjectPoolConfig());
		LOG.info("Jedis Cluster Factory Initialize Success!");
		return jedisClusterFactory;
	}
	
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.cisiondata.utils.reflect.ReflectUtils;
import org.cisiondata.utils.serde.SerializerUtils;
import org.cisiondata.utils.spring.SpringBeanFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Tuple;
import redis.clients.util.SafeEncoder;

public class RedisClusterUtils {
	
	private Logger LOG = LoggerFactory.getLogger(RedisClusterUtils.class);
	
	private JedisCluster jedisCluster = null;

	private RedisClusterUtils() {
		this.jedisCluster = (JedisCluster) SpringBeanFactory.getBean("jedisCluster");
	}

	private static class RedisClusterUtilsHolder {
		public static RedisClusterUtils INSTANCE = new RedisClusterUtils();
	}

	public static RedisClusterUtils getInstance() {
		return RedisClusterUtilsHolder.INSTANCE;
	}
	
	public JedisCluster getJedisCluster() {
		return jedisCluster;
	}
	
	/**
	 * 讀取keys
	 * @param pattern
	 * @return
	 */
	public Set<String> keys(String pattern) {
		Set<String> keys = new HashSet<String>();
		Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes();
		for (Map.Entry<String, JedisPool> entry : clusterNodes.entrySet()) {
			Jedis connection = entry.getValue().getResource();
			try {
				Set<byte[]> keysByte = connection.keys(SafeEncoder.encode(pattern));
				for (byte[] keyByte : keysByte) {
					try {
						keys.add((String) SerializerUtils.read(keyByte));
					} catch (Exception e) {
						keys.add(SafeEncoder.encode(keyByte));
					}
				}
			} finally {
				connection.close();
			}
		}
		return keys;
	}
	
	/**
	 * 返回key的型別
	 * The type can be one of "none", string", "list", "set", "zset", "hash"
	 * @param key
	 * @return
	 */
	public String type(String key) {
		try {
			return jedisCluster.type(SerializerUtils.write(key));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return "none";
	}
	
	/**
	 * 是否存在key
	 * @param key
	 * @return
	 */
	public boolean exists(String key) {
		try {
			return jedisCluster.exists(SerializerUtils.write(key));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return false;
	}
	
	/**
	 * 設定過期時間
	 * @param key
	 * @param seconds
	 * @return
	 */
	public Long expire(String key, int seconds) {
		try {
			return jedisCluster.expire(SerializerUtils.write(key), seconds);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0L;
	}
	
	/**
	 * 快取資料
	 * @param key
	 * @param value
	 */
	public void set(String key, Object value) {
		try {
			jedisCluster.set(SerializerUtils.write(key), SerializerUtils.write(value));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
	}

	/**
	 * 快取資料
	 * @param key
	 * @param value
	 */
	public void set(Object key, Object value) {
		try {
			jedisCluster.set(SerializerUtils.write(key), SerializerUtils.write(value));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
	}
	
	/**
	 * 快取資料並設定過期時間
	 * @param key
	 * @param value
	 * @param expireTime
	 */
	public void set(String key, Object value, int expireTime) {
		try {
			byte[] cache_key = SerializerUtils.write(key);
			jedisCluster.set(cache_key, SerializerUtils.write(value));
			jedisCluster.expire(cache_key, expireTime);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
	}
	
	/**
	 * 快取資料並設定過期時間
	 * @param key
	 * @param value
	 * @param expireTime
	 */
	public void set(Object key, Object value, int expireTime) {
		try {
			byte[] cache_key = SerializerUtils.write(key);
			jedisCluster.set(cache_key, SerializerUtils.write(value));
			jedisCluster.expire(cache_key, expireTime);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
	}
	
	/**
	 * 快取資料
	 * @param key
	 * @param value
	 * @return
	 */
	public Long setnx(Object key, Object value) {
		try {
			return jedisCluster.setnx(SerializerUtils.write(key), SerializerUtils.write(value));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0L;
	}
	
	/**
	 * 遞增KEY
	 * @param key
	 * @return
	 */
	public Long incr(Object key) {
		try {
			return jedisCluster.incr(SerializerUtils.write(key));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0L;
	}
	
	/**
	 * 遞增KEY
	 * @param key
	 * @param incr
	 * @return
	 */
	public Long incrBy(Object key, long incr) {
		try {
			return jedisCluster.incrBy(SerializerUtils.write(key), incr);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0L;
	}
	
	/**
	 * 讀取資料
	 * @param key
	 * @return
	 */
	public Object get(String key) {
		if (StringUtils.isBlank(key)) return null;
		try {
			byte[] value = jedisCluster.get(SerializerUtils.write(key));
			if (null != value && value.length != 0) {
				return SerializerUtils.read(value);
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * 讀取資料
	 * @param key
	 * @return
	 */
	public Object get(Object key) {
		if (null == key) return null;
		try {
			byte[] value = jedisCluster.get(SerializerUtils.write(key));
			if (null != value && value.length != 0) {
				return SerializerUtils.read(value);
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * 讀取資料
	 * @param key
	 * @param value
	 * @return
	 */
	public Object getSet(Object key, Object value) {
		if (null == key || null == value) return null;
		try {
			byte[] ovalue = jedisCluster.getSet(SerializerUtils.write(key), SerializerUtils.write(value));
			if (null != ovalue && ovalue.length != 0) {
				return SerializerUtils.read(ovalue);
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * 刪除KEY
	 * @param key
	 * @return
	 */
	public Long delete(String key) {
		if (StringUtils.isBlank(key)) return null;
		try {
			return jedisCluster.del(SerializerUtils.write(key));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * 刪除KEY
	 * @param key
	 * @return
	 */
	public Long delete(Object key) {
		if (null == key) return null;
		try {
			return jedisCluster.del(SerializerUtils.write(key));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * 新增SET資料集合
	 * @param key
	 * @param members
	 * @return
	 */
	public long sadd(String key, String... members) {
		try {
			return jedisCluster.sadd(key, members);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * 新增SET資料集合
	 * @param key
	 * @param members
	 * @return
	 */
	public long sadd(String key, Object... members) {
		try {
			if (null == members|| members.length == 0) return 0;
			byte[][] bmembers = new byte[members.length][];
			for (int i = 0, len = members.length; i < len; i++) {
				bmembers[i] = SerializerUtils.write(members[i]);
			}
			return jedisCluster.sadd(SerializerUtils.write(key), bmembers);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * SET資料集合成員是否存在
	 * @param key
	 * @param member
	 * @return
	 */
	public boolean sismember(String key, String member) {
		try {
			return jedisCluster.sismember(key, member);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return false;
	}
	
	/**
	 * SET資料集合長度
	 * @param key
	 * @return
	 */
	public long scard(String key) {
		try {
			return jedisCluster.scard(key);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * 獲取KEY中SET資料集合
	 * @param key
	 * @return
	 */
	public Set<String> smembers(String key) {
		try {
			return jedisCluster.smembers(key);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * 獲取KEY中SET資料集合
	 * @param key
	 * @return
	 */
	public Set<Object> smembers2obj(String key) {
		Set<Object> results = new HashSet<Object>();
		try {
			Set<byte[]> bresults = jedisCluster.smembers(SerializerUtils.write(key));
			if (null == bresults || bresults.isEmpty()) return results;
			for (byte[] bresult : bresults) {
				results.add(SerializerUtils.read(bresult));
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return results;
	}
	
	/**
	 * 刪除SET資料集合
	 * @param key
	 * @param members
	 * @return
	 */
	public long srem(String key, String... members) {
		try {
			return jedisCluster.srem(key, members);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * 刪除SET資料集合
	 * @param key
	 * @param members
	 * @return
	 */
	public long srem(String key, Object... members) {
		try {
			if (null == members|| members.length == 0) return 0;
			byte[][] bmembers = new byte[members.length][];
			for (int i = 0, len = members.length; i < len; i++) {
				bmembers[i] = SerializerUtils.write(members[i]);
			}
			return jedisCluster.srem(SerializerUtils.write(key), bmembers);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * 佇列插入資料
	 * @param key
	 * @param value
	 * @return
	 */
	public long listPush(String key, Object value) {
		try {
			return jedisCluster.lpush(SerializerUtils.write(key), SerializerUtils.write(value));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * 佇列取出資料
	 * @param key
	 * @return
	 */
	public Object listPop(String key) {
		try {
			byte[] returnObject = jedisCluster.rpop(SerializerUtils.write(key));
			if (null != returnObject && returnObject.length != 0) {
				return SerializerUtils.read(returnObject);
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * 佇列資料長度
	 * @param key
	 * @return
	 */
	public long listLength(String key) {
		try {
			return jedisCluster.llen(SerializerUtils.write(key));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * Hash快取資料
	 * @param key
	 * @param field
	 * @param value
	 * @return
	 */
	public long hset(String key, String field, Object value) {
		try {
			return jedisCluster.hset(SerializerUtils.write(key), 
				SerializerUtils.write(field), SerializerUtils.write(value));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * Hash快取資料
	 * @param key
	 * @param map
	 * @return
	 */
	public String hset(String key, Map<String, ?> value) {
		try {
			Map<byte[], byte[]> hash = new HashMap<byte[], byte[]>();
			for (Map.Entry<String, ?> entry : value.entrySet()) {
				hash.put(SerializerUtils.write(entry.getKey()), 
					SerializerUtils.write(entry.getValue()));
			}
			return jedisCluster.hmset(SerializerUtils.write(key), hash);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * Hash快取實體Bean
	 * @param key
	 * @param value
	 * @param expireTime
	 * @return
	 */
	public String hsetBean(Object key, Object value, int expireTime) {
		try {
			if (null == value) return null;
			Map<byte[], byte[]> hash = new HashMap<byte[], byte[]>();
			Map<String, Object> map = ReflectUtils.convertObjectToObjectMap(value);
			for (Map.Entry<String, Object> entry : map.entrySet()) {
				hash.put(SerializerUtils.write(entry.getKey()), 
					SerializerUtils.write(entry.getValue()));
			}
			byte[] keyBytes = SerializerUtils.write(key);
			String result = jedisCluster.hmset(keyBytes, hash);
			jedisCluster.expire(keyBytes, expireTime);
			return result;
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * Hash快取實體Bean
	 * @param key
	 * @param value
	 * @return
	 */
	public String hsetBean(Object key, Object value) {
		try {
			if (null == value) return null;
			Map<byte[], byte[]> hash = new HashMap<byte[], byte[]>();
			Map<String, Object> map = ReflectUtils.convertObjectToObjectMap(value);
			for (Map.Entry<String, Object> entry : map.entrySet()) {
				hash.put(SerializerUtils.write(entry.getKey()), 
					SerializerUtils.write(entry.getValue()));
			}
			return jedisCluster.hmset(SerializerUtils.write(key), hash);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * Hash是否存在field
	 * @param key
	 * @param field
	 * @return
	 */
	public boolean hexists(String key, String field) {
		try {
			return jedisCluster.hexists(SerializerUtils.write(key), SerializerUtils.write(field));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return false;
	}
	
	/**
	 * Hash欄位自增資料
	 * @param key
	 * @param field
	 * @param value
	 * @return
	 */
	public long hincrBy(String key, String field, long value) {
		try {
			return jedisCluster.hincrBy(SerializerUtils.write(key), 
				SerializerUtils.write(field), value);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * Hash讀取資料
	 * @param key
	 * @param field
	 * @return
	 */
	public Object hget(String key, String field) {
		try {
			byte[] returnObject = jedisCluster.hget(SerializerUtils.write(key), SerializerUtils.write(field));
			if (null != returnObject && returnObject.length != 0) {
				return SerializerUtils.read(returnObject);
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	public Object hgetBean(String key, Class<?> entityClass) {
		try {
			Map<byte[], byte[]> hash = jedisCluster.hgetAll(SerializerUtils.write(key));
			if (null != hash && !hash.isEmpty()) {
				Map<String, Object> map = new HashMap<String, Object>();
				for (Map.Entry<byte[], byte[]> entry : hash.entrySet()) {
					map.put((String) SerializerUtils.read(entry.getKey()), 
						SerializerUtils.read(entry.getValue()));
				}
				Object returnObject = entityClass.newInstance();
				ReflectUtils.convertObjectMapToObject(map, returnObject);
				return returnObject;
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * Hash讀取資料
	 * @param key
	 * @return
	 */
	public Map<String, Object> hgetAll(String key) {
		try {
			Map<byte[], byte[]> returnObject = jedisCluster.hgetAll(SerializerUtils.write(key));
			if (null != returnObject && !returnObject.isEmpty()) {
				Map<String, Object> map = new HashMap<String, Object>();
				for (Map.Entry<byte[], byte[]> entry : returnObject.entrySet()) {
					map.put((String) SerializerUtils.read(entry.getKey()), 
						SerializerUtils.read(entry.getValue()));
				}
				return map;
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}
	
	/**
	 * Hash刪除fields
	 * @param key
	 * @param fields
	 * @return
	 */
	public long hdel(String key, String... fields) {
		try {
			return jedisCluster.hdel(SerializerUtils.write(key), SerializerUtils.write(fields));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * SortedSet新增成員
	 * @param key
	 * @param member
	 * @param score
	 * @return
	 */
	public long zadd(String key, Object member, double score) {
		try {
			return jedisCluster.zadd(SerializerUtils.write(key), score, SerializerUtils.write(member));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * SortedSet新增成員
	 * @param key
	 * @param member
	 * @param score
	 * @return
	 */
	public long zadd(String key, Map<Object, Double> members) {
		try {
			Map<byte[], Double> scoreMembers = new HashMap<byte[], Double>();
			for (Map.Entry<Object, Double> entry : members.entrySet()) {
				scoreMembers.put(SerializerUtils.write(entry.getKey()), entry.getValue());
			}
			return jedisCluster.zadd(SerializerUtils.write(key), scoreMembers);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * SortedSet讀取成員
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public Set<Object> zrange(String key, long start, long end) {
		Set<Object> results = new HashSet<Object>();
		try {
			Set<byte[]> bresults = jedisCluster.zrange(SerializerUtils.write(key), start, end);
			if (null == bresults || bresults.isEmpty()) return results;
			for (byte[] bresult : bresults) {
				results.add(SerializerUtils.read(bresult));
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return results;
	}
	
	/**
	 * SortedSet讀取成員和分數
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public List<Map.Entry<String, Double>> zrangeWithScores(String key, long start, long end) {
		List<Map.Entry<String, Double>> resultList = new ArrayList<Map.Entry<String, Double>>();
		try {
			Set<Tuple> tuples = jedisCluster.zrangeWithScores(SerializerUtils.write(key), start, end);
			if (null == tuples || tuples.isEmpty()) return resultList;
			Map<String, Double> results = new HashMap<String, Double>();
			for (Tuple tuple : tuples) {
				results.put(String.valueOf(SerializerUtils.read(tuple.getBinaryElement())), tuple.getScore());
			}
			resultList.addAll(results.entrySet());
			Collections.sort(resultList, new Comparator<Map.Entry<String, Double>>(){
				@Override
				public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
					return o1.getValue().compareTo(o2.getValue());
				}
			});
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return resultList;
	}
	
	/**
	 * SortedSet讀取成員
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public Set<Object> zrevrange(String key, long start, long end) {
		Set<Object> results = new HashSet<Object>();
		try {
			Set<byte[]> bresults = jedisCluster.zrevrange(SerializerUtils.write(key), start, end);
			if (null == bresults || bresults.isEmpty()) return results;
			for (byte[] bresult : bresults) {
				results.add(SerializerUtils.read(bresult));
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return results;
	}
	
	/**
	 * SortedSet讀取成員和分數
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public List<Map.Entry<String, Double>> zrevrangeWithScores(String key, long start, long end) {
		List<Map.Entry<String, Double>> resultList = new ArrayList<Map.Entry<String, Double>>();
		try {
			Set<Tuple> tuples = jedisCluster.zrevrangeWithScores(SerializerUtils.write(key), start, end);
			if (null == tuples || tuples.isEmpty()) return resultList;
			Map<String, Double> results = new HashMap<String, Double>();
			for (Tuple tuple : tuples) {
				results.put(String.valueOf(SerializerUtils.read(tuple.getBinaryElement())), tuple.getScore());
			}
			resultList.addAll(results.entrySet());
			Collections.sort(resultList, new Comparator<Map.Entry<String, Double>>(){
				@Override
				public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
					return -o1.getValue().compareTo(o2.getValue());
				}
			});
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return resultList;
	}
	
	/**
	 * SORTEDSET資料集合長度
	 * @param key
	 * @return
	 */
	public long zcard(String key) {
		try {
			return jedisCluster.zcard(SerializerUtils.write(key));
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
	/**
	 * SortedSet移除成員
	 * @param key
	 * @param member
	 * @return
	 */
	public long zrem(String key, Object... members) {
		try {
			if (null == members|| members.length == 0) return 0;
			byte[][] bmembers = new byte[members.length][];
			for (int i = 0, len = members.length; i < len; i++) {
				bmembers[i] = SerializerUtils.write(members[i]);
			}
			return jedisCluster.zrem(SerializerUtils.write(key), bmembers);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		}
		return 0;
	}
	
}