Spring整合redis

环境配置

db.properties

redis_TIMEOUT = 100000
redis_REDIS_HOST = 127.0.0.1
redis_REDIS_PORT = 6379
redis_REDIS_PWD = 123456
redis_SSSION_TIMEOUT = 1800
redis_MAX_TOTAL = 500
redis_MAX_IDLE = 100

application-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
	xmlns:jee="http://www.springframework.org/schema/jee" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
	
	<!-- redis 相关配置 --> 
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
	    <property name="maxTotal" value="${redis_MAX_TOTAL}" />
	    <property name="maxIdle" value="${redis_MAX_IDLE}" />
	</bean>
    <bean id="jedisConnectionFactory"
      class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
	    <property name="hostName" value="${redis_REDIS_HOST}"/>
	    <property name="port" value="${redis_REDIS_PORT}"/>
	    <property name="password" value="${redis_REDIS_PWD}" />
	    <property name="timeout" value="${redis_TIMEOUT}"/>
	    <property name="usePool" value="true"/>
	    <property name="poolConfig" ref="jedisPoolConfig"/>
	</bean>
	<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
		<constructor-arg index="0" ref="jedisPoolConfig" />
		<constructor-arg index="1">
			<list>
				<bean name="master" class="redis.clients.jedis.JedisShardInfo">
					<constructor-arg index="0" value="${redis_REDIS_HOST}" />
					<constructor-arg index="1" value="${redis_REDIS_PORT}" type="int" />
					<property name="timeout" value="${redis_TIMEOUT}"/>
					<property name="password" value="${redis_REDIS_PWD}"/>
				</bean>
			</list>
		</constructor-arg>
	</bean>
</beans>

application-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
	xmlns:jee="http://www.springframework.org/schema/jee" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
	<!-- 扫描redis包 -->
	<context:component-scan base-package="com.shyb.redis"/>
	<!-- 加载其他配置文件 -->
	<import resource="application-dao.xml"/><!--dao中读取db.properties-->
	<import resource="application-redis.xml"/>
</beans>

redis包和java文件

包和结构

自己项目的包
Spring整合redis

CallBack.java

package com.shyb.redis;

import redis.clients.jedis.ShardedJedis;
//回调接口
public interface CallBack {
	Object doExecute(ShardedJedis shardedJedis);
}

RedisDataSourceImpl

package com.shyb.redis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

@Repository
public class RedisDataSourceImpl implements RedisDataSource {

	private static Logger logger = LoggerFactory.getLogger(RedisDataSourceImpl.class);

    @Autowired
    private ShardedJedisPool shardedJedisPool;

    public ShardedJedis getRedisClient() {
        try {
            ShardedJedis shardJedis = shardedJedisPool.getResource();
            return shardJedis;
        } catch (Exception e) {
        	logger.error("getRedisClent error", e);
        }
        return null;
    }

    public void returnResource(ShardedJedis shardedJedis) {
        shardedJedisPool.returnResource(shardedJedis);
    }

    public void returnResource(ShardedJedis shardedJedis, boolean broken) {
        if (broken) {
            shardedJedisPool.returnBrokenResource(shardedJedis);
        } else {
            shardedJedisPool.returnResource(shardedJedis);
        }
    }

}

RedisDataSource

package com.shyb.redis;

import redis.clients.jedis.ShardedJedis;

public interface RedisDataSource {
    public abstract ShardedJedis getRedisClient();
    public void returnResource(ShardedJedis shardedJedis);
    public void returnResource(ShardedJedis shardedJedis,boolean broken);
}

RedisClientTemplate

package com.shyb.redis;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPipeline;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.Tuple;

/**
 * http://doc.redisfans.com/index.html查看api
 */
@SuppressWarnings("all")
@Repository
public class RedisClientTemplate {

	private static Logger log = LoggerFactory.getLogger(RedisClientTemplate.class);

	@Autowired
	private RedisDataSource redisDataSource;

	public void disconnect() {
		ShardedJedis shardedJedis = redisDataSource.getRedisClient();
		shardedJedis.disconnect();
	}
	/**
	 * 获取ShardedJedis并执行的模板方法
	 * @param back 根据ShardedJedis执行具体的方法
	 * @return
	 */
	private Object executeRedis(CallBack back) {
		Object result = null;
		ShardedJedis shardedJedis = redisDataSource.getRedisClient();
		if (shardedJedis == null) {
			return result;
		}
		boolean broken = false;
		try {
			result = back.doExecute(shardedJedis);
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			broken = true;
		} finally {
			redisDataSource.returnResource(shardedJedis, broken);
		}
		return result;
	}
	/**
	 * 根据通配符找到符合条件的key
	 * @param pattern
	 * @return
	 */
	public Set<String> keys(String pattern) {
		return (Set<String>) executeRedis(new CallBack() {
			public Set<String> doExecute(ShardedJedis shardedJedis) {
				Jedis j =  shardedJedis.getShard(pattern);
				return j.keys(pattern);
			}
		});
	}

	/**
	 * 设置单个key
	 * @param key
	 * @param value
	 * @return
	 */
	public String set(String key,String value) {
		return (String) executeRedis(new CallBack() {
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.set(key, value);
			}
		});
	}

	/**
	 * 获取单个key
	 * 
	 * @param key
	 * @return
	 */
	public String get(String key) {
		return (String) executeRedis(new CallBack() {
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.get(key);
			}
		});
	}
	/**
	 * 判断key是否存在
	 * @param key
	 * @return
	 */
	public Boolean exists(String key) {
		return (Boolean) executeRedis(new CallBack() {
			@Override
			public Boolean doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.exists(key);
			}
		});
	}
	/**
	 * 查询key的类型
	 * 1.不存在 none 2.字符串string 3.列表list 4.集合set 5.有序集zset 6.哈希表hash
	 * @param key
	 * @return
	 */
	public String type(String key) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.type(key);
			}
		});
	}

	/**
	 * 在seconds秒后失效
	 * 
	 * @param key
	 * @param unixTime
	 * @return
	 */
	public Long expire(String key, int seconds) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.expire(key, seconds);
			}
		});
	}

	/**
	 * 在某个时间点失效
	 * @param key
	 * @param unixTime unix时间戳
	 * @return
	 */
	public Long expireAt(String key, long unixTime) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.expireAt(key, unixTime);
			}
		});
	}
	
	/**
	 * 查询key还有多少生效时间
	 * @param key
	 * @return key不存在返回-2 没有设置生效时间返回-1
	 */
	public Long ttl(String key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.ttl(key);
			}
		});
	}
	/**
	 * 二进制设置偏移值 如 a:01100001 变为b:01100010 需要调用setbit(key,7,0);setbit(key,6,1);  key的value是a
	 * @param key
	 * @param offset 偏移量
	 * @param value	true为1 false为0
	 * @return 返回值为原有位置的值 如:a变b  setbit(key,7,0)返回true setbit(key,6,1)返回false
	 */
	public boolean setbit(String key, long offset, boolean value) {
		return (boolean) executeRedis(new CallBack() {
			@Override
			public Object doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.setbit(key, offset, value);
			}
		});
	}
	/**
	 * 获取key对应的value的二进制所在偏移量的值
	 * @param key
	 * @param offset
	 * @return
	 */
	public boolean getbit(String key, long offset) {
		return (boolean) executeRedis(new CallBack() {
			@Override
			public Object doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.getbit(key, offset);
			}
		});
	}
	/**
	 * 将key对应的value从偏移量位置开始替换为value等长的字符串
	 * key不存在,会创建key value为""
	 * @param key
	 * @param offset
	 * @param value
	 * @return
	 */
	public long setrange(String key, long offset, String value) {
		return (long) executeRedis(new CallBack() {
			@Override
			public Object doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.setrange(key, offset, value);
			}
		});
	}
	/**
	 * 等价于substring,但包含头和尾  substring不包含尾
	 * @param key
	 * @param startOffset
	 * @param endOffset
	 * @return
	 */
	public String getrange(String key, long startOffset, long endOffset) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.getrange(key, startOffset, endOffset);
			}
		});
	}
	/**
	 * 设置并返回旧值  没有返回null
	 * set方法返回值为"OK"
	 * @param key
	 * @param value
	 * @return
	 */
	public String getSet(String key, String value) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.getSet(key, value);
			}
		});
	}
	/**
	 * 当key不存在时设置值,返回1
	 * 当key存在时不改动,返回0
	 * @param key
	 * @param value
	 * @return
	 */
	public Long setnx(String key, String value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.setnx(key, value);
			}
		});
	}
	/**
	 * 设置或替换值,并设置生存时间
	 * @param key
	 * @param seconds
	 * @param value
	 * @return
	 */
	public String setex(String key, int seconds, String value) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.setex(key, seconds, value);
			}
		});
	}
	/**
	 * 将key对应的数值减count并返回
	 * 如果key不存在,创建key,默认值为0
	 * @param key
	 * @return
	 */
	public Long decrBy(String key, long count) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.decrBy(key, count);
			}
		});
	}
	/**
	 * 将key对应的数值减1并返回
	 * 如果key不存在,创建key,默认值为0,再减一(即返回-1)
	 * @param key
	 * @return
	 */
	public Long decr(String key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.decr(key);
			}
		});
	}
	/**
	 * 将key对应的数值加count并返回
	 * 如果key不存在,创建key,默认值为0
	 * @param key
	 * @return
	 */
	public Long incrBy(String key, long count) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.incrBy(key, count);
			}
		});
	}
	/**
	 * 将key对应的数值加1并返回
	 * 如果key不存在,创建key,默认值为0,再加一(即返回1)
	 * @param key
	 * @return
	 */
	public Long incr(String key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.incr(key);
			}
		});
	}
	/**
	 * 追加字符串,相当于StringBuilder的append
	 * key不存在时等价于set方法
	 * @param key
	 * @param value
	 * @return 返回最终字符串的长度
	 */
	public Long append(String key, String value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.append(key, value);
			}
		});
	}
	/**
	 * 和getrange作用一样
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public String substr(String key, int start, int end) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.substr(key, start, end);
			}
		});
	}
	/**
	 * key不存在,创建新的hash表
	 * key存在。 field存在,value被覆盖。field不存在,添加新的
	 * @param key
	 * @param field
	 * @param value
	 * @return 值被覆盖返回0,创建新参数返回1
	 */
	public Long hset(String key, String field, String value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hset(key, field, value);
			}
		});
	}
	/**
	 * key或field不存在时返回null
	 * @param key
	 * @param field
	 * @return
	 */
	public String hget(String key, String field) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hget(key, field);
			}
		});
	}
	/**
	 * 如果key,field都存在,不执行操作,返回0
	 * 其他情况执行并返回1
	 * @param key
	 * @param field
	 * @param value
	 * @return
	 */
	public Long hsetnx(String key, String field, String value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hsetnx(key, field, value);
			}
		});
	}
	/**
	 * 将多个field和value值设置到key中,会覆盖旧值。返回"OK"
	 * @param key
	 * @param hash
	 * @return
	 */
	public String hmset(String key, Map<String, String> hash) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hmset(key, hash);
			}
		});
	}
	/**
	 * 根据fields返回1个或多个value,并存入list中。如果field不存在,list也会添加一个null
	 * @param key
	 * @param fields
	 * @return
	 */
	public List<String> hmget(String key, String... fields) {
		return (List<String>) executeRedis(new CallBack() {
			@Override
			public List<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hmget(key, fields);
			}
		});
	}
	/**
	 * 给key下的field属性的值添加value增量,不存在则创建默认值0
	 * key下的field属性的值是字符串时,报错JedisDataException
	 * @param key
	 * @param field
	 * @param value
	 * @return
	 */
	public Long hincrBy(String key, String field, long value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hincrBy(key, field, value);
			}
		});
	}
	/**
	 * 判断是否存在key以及对应的field域
	 * @param key
	 * @param field
	 * @return
	 */
	public Boolean hexists(String key, String field) {
		return (Boolean) executeRedis(new CallBack() {
			@Override
			public Boolean doExecute(ShardedJedis shardedJedis) {
				return  shardedJedis.hexists(key, field);
			}
		});
	}
	/**
	 * 删除指定的key
	 * @param key
	 * @return
	 */
	public Long del(String key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.del(key);
			}
		});
	}
	/**
	 * 删除指定的key下的field
	 * @param key
	 * @param field
	 * @return
	 */
	public Long hdel(String key, String field) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hdel(key, field);
			}
		});
	}
	/**
	 * 获取key下的filed数量
	 * @param key
	 * @return
	 */
	public Long hlen(String key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hlen(key);
			}
		});
	}
	/**
	 * 获取key下所有的field
	 * @param key
	 * @return
	 */
	public Set<String> hkeys(String key) {
		return (Set<String>) executeRedis(new CallBack() {
			@Override
			public Set<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hkeys(key);
			}
		});
	}
	/**
	 * 获取key下所有field对应的value
	 * @param key
	 * @return
	 */
	public List<String> hvals(String key) {
		return (List<String>) executeRedis(new CallBack() {
			@Override
			public List<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hvals(key);
			}
		});
	}
	/**
	 * 获取key下的所有键值对
	 * @param key
	 * @return
	 */
	public Map<String, String> hgetAll(String key) {
		return (Map<String, String>) executeRedis(new CallBack() {
			@Override
			public Map<String, String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hgetAll(key);
			}
		});
	}


	// ================list ====== l表示 list,l表示left, r表示right====================
	/**
	 * 向列表key的右边添加string元素,key不是列表报错
	 * @param key
	 * @param string
	 * @return 新列表的长度
	 */
	public Long rpush(String key, String string) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.rpush(key, string);
			}
		});
	}
	/**
	 * 向列表key的左边添加string元素,key不是列表报错
	 * @param key
	 * @param string
	 * @return 新列表的长度
	 */
	public Long lpush(String key, String string) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lpush(key, string);
			}
		});
	}
	/**
	 * 返回列表key的长度,key不存在返回0,key不是列表报错
	 * @param key
	 * @return
	 */
	public Long llen(String key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.llen(key);
			}
		});
	}
	/**
	 * 返回列表key的start到end位置的元素 含头含尾  end为-1标识最后一位
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public List<String> lrange(String key, long start, long end) {
		return (List<String>) executeRedis(new CallBack() {
			@Override
			public List<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lrange(key, start, end);
			}
		});
	}
	/**
	 * 清空不在start和end范围内的列表
	 * @param key
	 * @param start
	 * @param end
	 * @return  "OK"
	 */
	public String ltrim(String key, long start, long end) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.ltrim(key, start, end);
			}
		});
	}
	/**
	 * 根据key和下标获取列表对应位置的值
	 * @param key
	 * @param index
	 * @return
	 */
	public String lindex(String key, long index) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lindex(key, index);
			}
		});
	}
	/**
	 * 修改列表key对应Index下标的值
	 * key不存在或Index越界报错,成功返回"OK"
	 * @param key
	 * @param index
	 * @param value
	 * @return
	 */
	public String lset(String key, long index, String value) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lset(key, index, value);
			}
		});
	}
	/**
	 * 移除列表key的value元素
	 * count为要移除的数量  正数:从左开始 负数:从右开始
	 * @param key
	 * @param count
	 * @param value
	 * @return  实际移除数量
	 */
	public Long lrem(String key, long count, String value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lrem(key, count, value);
			}
		});
	}
	/**
	 * 移除列表第一个(左)元素,没有返回null
	 * @param key
	 * @return
	 */
	public String lpop(String key) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lpop(key);
			}
		});
	}
	/**
	 * 移除列表最后一个(右)元素,没有返回null
	 * @param key
	 * @return
	 */
	public String rpop(String key) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.rpop(key);
			}
		});
	}

	/**
	 * 向key对应的集合中添加member成员  已存在不添加,返回0.不存在添加,返回1
	 * @param key
	 * @param member
	 * @return
	 */
	public Long sadd(String key, String member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.sadd(key, member);
			}
		});
	}
	/**
	 * 向key对应的集合中添加1或多个member,成功返回添加的个数
	 * @param key
	 * @param member
	 * @return
	 */
	public Long sadd(String key, String... member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.sadd(key, member);
			}
		});
	}
	/**
	 * 获取key对应的集合中所有的元素
	 * @param key
	 * @return
	 */
	public Set<String> smembers(String key) {
		return (Set<String>) executeRedis(new CallBack() {
			@Override
			public Set<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.smembers(key);
			}
		});
	}
	/**
	 * 移除key对应的集合中的member成员 
	 * @param key
	 * @param member
	 * @return 0 未移除 1移除1个
	 */
	public Long srem(String key, String member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.srem(key, member);
			}
		});
	}
	/**
	 * 随机移除集合中的一个成员
	 * @param key
	 * @return
	 */
	public String spop(String key) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.spop(key);
			}
		});
	}
	/**
	 * 获取集合的基数(成员个数)
	 * @param key
	 * @return
	 */
	public Long scard(String key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.scard(key);
			}
		});
	}
	/**
	 * 判断member是不是key对应集合的成员
	 * @param key
	 * @param member
	 * @return
	 */
	public Boolean sismember(String key, String member) {
		return (Boolean) executeRedis(new CallBack() {
			@Override
			public Boolean doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.sismember(key, member);
			}
		});
	}
	/**
	 * 随机获取集合中的一个元素
	 * @param key
	 * @return
	 */
	public String srandmember(String key) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.srandmember(key);
			}
		});
	}
	/**
	 * 添加或修改key对应的有序集合的member成员的score值
	 * @param key
	 * @param score
	 * @param member
	 * @return  添加的个数
	 */
	public Long zadd(String key, double score, String member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zadd(key, score, member);
			}
		});
	}
	/**
	 * 获取start和end区间的成员,按score递增顺序排
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public Set<String> zrange(String key, int start, int end) {
		return (Set<String>) executeRedis(new CallBack() {
			@Override
			public Set<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrange(key, start, end);
			}
		});
	}
	/**
	 * 获取start和end区间的成员,按score递减顺序排
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public Set<String> zrevrange(String key, int start, int end) {
		return (Set<String>) executeRedis(new CallBack() {
			@Override
			public Set<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrange(key, start, end);
			}
		});
	}
	/**
	 * 移除有序集合的member成员  
	 * @param key
	 * @param member
	 * @return  移除的数量 返回1或0
	 */
	public Long zrem(String key, String member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrem(key, member);
			}
		});
	}
	/**
	 * 给key对应的member成员添加score分,score可以为负数
	 * @param key
	 * @param score
	 * @param member
	 * @return  member的新score值
	 */
	public Double zincrby(String key, double score, String member) {
		return (Double) executeRedis(new CallBack() {
			@Override
			public Double doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zincrby(key, score, member);
			}
		});
	}
	/**
	 * key中member成员的排名(score从小到大排 第一score值最小)  第一名返回0 第二返回1 ……
	 * @param key
	 * @param member
	 * @return
	 */
	public Long zrank(String key, String member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrank(key, member);
			}
		});
	}
	/**
	 * key中member成员的排名(score从大到小排) score最大返回0 第二返回1 ……
	 * @param key
	 * @param member
	 * @return
	 */
	public Long zrevrank(String key, String member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrank(key, member);
			}
		});
	}
	/**
	 * 获取key的start到end区间的成员和分数,并按照score从低到高排
	 * Tuple对象的element为成员,score为对应的分数
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public Set<Tuple> zrangeWithScores(String key, int start, int end) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrangeWithScores(key, start, end);
			}
		});
	}
	/**
	 * 获取key的start到end区间的成员和分数,并按照score从高到低排
	 * Tuple对象的element为成员,score为对应的分数
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public Set<Tuple> zrevrangeWithScores(String key, int start, int end) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrangeWithScores(key, start, end);
			}
		});
	}
	/**
	 * 获取有序集合的长度
	 * @param key
	 * @return  key不存在返回0
	 */
	public Long zcard(String key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zcard(key);
			}
		});
	}
	/**
	 * 获取有序集合key中member的score值,不存在返回null
	 * @param key
	 * @param member
	 * @return
	 */
	public Double zscore(String key, String member) {
		return (Double) executeRedis(new CallBack() {
			@Override
			public Double doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zscore(key, member);
			}
		});
	}
	/**
	 * 返回或保存key(列表,集合,有序集合)中经过排序的成员
	 * 默认按照数字排序从小到大
	 * @param key
	 * @return
	 */
	public List<String> sort(String key) {
		return (List<String>) executeRedis(new CallBack() {
			@Override
			public List<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.sort(key);
			}
		});
	}
	/**
	 * 返回或保存key(列表,集合,有序集合)中经过排序的成员
	 * 默认按照数字排序从小到大
	 * @param key
	 * @param sortingParameters  排序参数
	 * @return
	 */
	public List<String> sort(String key, SortingParams sortingParameters) {
		return (List<String>) executeRedis(new CallBack() {
			@Override
			public List<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.sort(key, sortingParameters);
			}
		});
	}
	/**
	 * 获取key对应有序集合中score在min到max之间的成员数量(包含min和max)
	 * @param key
	 * @param min
	 * @param max
	 * @return
	 */
	public Long zcount(String key, double min, double max) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zcount(key, min, max);
			}
		});
	}
	/**
	 * 获取key对应有序集合分数在min和max之间的所有成员(包含min和max)
	 * 成员顺序按score从小到大排序
	 * @param key
	 * @param min
	 * @param max
	 * @return
	 */
	public Set<String> zrangeByScore(String key, double min, double max) {
		return (Set<String>) executeRedis(new CallBack() {
			@Override
			public Set<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrangeByScore(key, min, max);
			}
		});
	}
	/**
	 * 获取key对应有序集合分数在min和max之间的所有成员(包含min和max)
	 * 成员顺序按score从大到小排序
	 * @param key
	 * @param min
	 * @param max
	 * @return
	 */
	public Set<String> zrevrangeByScore(String key, double max, double min) {
		return (Set<String>) executeRedis(new CallBack() {
			@Override
			public Set<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrangeByScore(key, min, max);
			}
		});
	}
	/**
	 * 获取key对应有序集合分数在min和max之间的所有成员(包含min和max)
	 * 成员顺序按score从小到大排序
	 * @param key
	 * @param min
	 * @param max
	 * @param offset  从那个位置取     offset过大会影响速度
	 * @param count	取的个数    和数据库的limit一样
	 * @return
	 */
	public Set<String> zrangeByScore(String key, double min, double max, int offset, int count) {
		return (Set<String>) executeRedis(new CallBack() {
			@Override
			public Set<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrangeByScore(key, min, max, offset, count);
			}
		});
	}
	/**
	 * 获取key对应有序集合分数在min和max之间的所有成员(包含min和max)
	 * 成员顺序按score从大到小排序
	 * @param key
	 * @param min
	 * @param max
	 * @param offset  从那个位置取     offset过大会影响速度
	 * @param count	取的个数    和数据库的limit一样
	 * @return
	 */
	public Set<String> zrevrangeByScore(String key, double max, double min, int offset, int count) {
		return (Set<String>) executeRedis(new CallBack() {
			@Override
			public Set<String> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrangeByScore(key, min, max, offset, count);
			}
		});
	}
	/**
	 * 获取key对应有序集合分数在min和max之间的所有成员和score值(包含min和max)
	 * 成员顺序按score从小到大排序
	 * @param key
	 * @param min
	 * @param max
	 * @return
	 */
	public Set<Tuple> zrangeByScoreWithScores(String key, double min, double max) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrangeByScoreWithScores(key, min, max);
			}
		});
	}
	/**
	 * 获取key对应有序集合分数在min和max之间的所有成员和score值(包含min和max)
	* 成员顺序按score从大到小排序
	* @param key
	* @param min
	* @param max
	* @return
	*/
	public Set<Tuple> zrevrangeByScoreWithScores(String key, double max, double min) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrangeByScoreWithScores(key, min, max);
			}
		});
	}
	/**
	 * 获取key对应有序集合分数在min和max之间的所有成员带score值(包含min和max)
	 * 成员顺序按score从小到大排序
	 * @param key
	 * @param min
	 * @param max
	 * @param offset  从那个位置取     offset过大会影响速度
	 * @param count	取的个数    和数据库的limit一样
	 * @return
	 */
	public Set<Tuple> zrangeByScoreWithScores(String key, double min, double max, int offset, int count) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrangeByScoreWithScores(key, min, max, offset, count);
			}
		});
	}
	/**
	 * 获取key对应有序集合分数在min和max之间的所有成员带score值(包含min和max)
	 * 成员顺序按score从大到小排序
	 * @param key
	 * @param min
	 * @param max
	 * @param offset  从那个位置取     offset过大会影响速度
	 * @param count	取的个数    和数据库的limit一样
	 * @return
	 */
	public Set<Tuple> zrevrangeByScoreWithScores(String key, double max, double min, int offset, int count) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrangeByScoreWithScores(key, min, max, offset, count);
			}
		});
	}
	/**
	 * 移除key对应有序集合的顺序在start至end的成员  
	 * 集合按score从小到大排
	 * @param key
	 * @param start
	 * @param end
	 * @return   移除的数量
	 */
	public Long zremrangeByRank(String key, int start, int end) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zremrangeByRank(key, start, end);
			}
		});
	}
	/**
	 * 删除key对应有序集合的score在start至end的成员
	 * 集合按score从小到大排
	 * @param key
	 * @param start
	 * @param end
	 * @return 移除的数量
	 */
	public Long zremrangeByScore(String key, double start, double end) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zremrangeByScore(key, start, end);
			}
		});
	}
	/**
	 * 向key对应列表的pivot成员(where设置before或after)插入value
	 * @param key
	 * @param where  枚举类
	 * @param pivot
	 * @param value
	 * @return  key不存在或列表为空,返回0  成功返回列表长度,pivot不存在返回-1
	 */
	public Long linsert(String key, LIST_POSITION where, String pivot, String value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.linsert(key, where, pivot, value);
			}
		});
	}
	/**
	 * 存储key value都为byte数组
	 * @param key
	 * @param value
	 * @return
	 */
	public String set(byte[] key, byte[] value) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.set(key, value);
			}
		});
	}
	/**
	 * 根据byte数组获取值
	 * @param key
	 * @return
	 */
	public byte[] get(byte[] key) {
		return (byte[]) executeRedis(new CallBack() {
			@Override
			public byte[] doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.get(key);
			}
		});
	}
	/**
	 * byte数组是否存在
	 * @param key
	 * @return
	 */
	public Boolean exists(byte[] key) {
		return (Boolean) executeRedis(new CallBack() {
			@Override
			public Boolean doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.exists(key);
			}
		});
	}
	/**
	 * 获取key类型
	 * @param key
	 * @return
	 */
	public String type(byte[] key) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.type(key);
			}
		});
	}
	/**
	 * 设置key生效时间
	 * @param key
	 * @param seconds
	 * @return	成功返回1
	 */
	public Long expire(byte[] key, int seconds) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.expire(key, seconds);
			}
		});
	}
	/**
	 * 设置在unixTime时失效
	 * @param key
	 * @param unixTime
	 * @return
	 */
	public Long expireAt(byte[] key, long unixTime) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.expireAt(key, unixTime);
			}
		});
	}
	/**
	 * 查询剩余生效时间
	 * @param key
	 * @return
	 */
	public Long ttl(byte[] key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.ttl(key);
			}
		});
	}
	/**
	 * 设置并获取原来存在的值
	 * @param key
	 * @param value
	 * @return
	 */
	public byte[] getSet(byte[] key, byte[] value) {
		return (byte[]) executeRedis(new CallBack() {
			@Override
			public byte[] doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.getSet(key, value);
			}
		});
	}
	/**
	 * 不存在时设置
	 * @param key
	 * @param value
	 * @return
	 */
	public Long setnx(byte[] key, byte[] value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.setnx(key, value);
			}
		});
	}
	/**
	 * 修改值、生效时间
	 * @param key
	 * @param seconds
	 * @param value
	 * @return
	 */
	public String setex(byte[] key, int seconds, byte[] value) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.setex(key, seconds, value);
			}
		});
	}
	
	public Long decrBy(byte[] key, long integer) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.decrBy(key, integer);
			}
		});
	}

	public Long decr(byte[] key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.decr(key);
			}
		});
	}

	public Long incrBy(byte[] key, long integer) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.incrBy(key, integer);
			}
		});
	}

	public Long incr(byte[] key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.incr(key);
			}
		});
	}

	public Long append(byte[] key, byte[] value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.append(key, value);
			}
		});
	}

	public byte[] substr(byte[] key, int start, int end) {
		return (byte[]) executeRedis(new CallBack() {
			@Override
			public byte[] doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.substr(key, start, end);
			}
		});
	}

	public Long hset(byte[] key, byte[] field, byte[] value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hset(key, field, value);
			}
		});
	}

	public byte[] hget(byte[] key, byte[] field) {
		return (byte[]) executeRedis(new CallBack() {
			@Override
			public byte[] doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hget(key, field);
			}
		});
	}
	
	public Long hsetnx(byte[] key, byte[] field, byte[] value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hsetnx(key, field, value);
			}
		});
	}

	public String hmset(byte[] key, Map<byte[], byte[]> hash) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hmset(key, hash);
			}
		});
	}

	public List<byte[]> hmget(byte[] key, byte[]... fields) {
		return (List<byte[]>) executeRedis(new CallBack() {
			@Override
			public List<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hmget(key, fields);
			}
		});
	}

	public Long hincrBy(byte[] key, byte[] field, long value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hincrBy(key, field, value);
			}
		});
	}

	public Boolean hexists(byte[] key, byte[] field) {
		return (Boolean) executeRedis(new CallBack() {
			@Override
			public Boolean doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hexists(key, field);
			}
		});
	}

	public Long hdel(byte[] key, byte[] field) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hdel(key, field);
			}
		});
	}
	
	public Long hlen(byte[] key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hlen(key);
			}
		});
	}
	
	public Set<byte[]> hkeys(byte[] key) {
		return (Set<byte[]>) executeRedis(new CallBack() {
			@Override
			public Set<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hkeys(key);
			}
		});
	}

	public Collection<byte[]> hvals(byte[] key) {
		return (Collection<byte[]>) executeRedis(new CallBack() {
			@Override
			public Collection<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hvals(key);
			}
		});
	}

	public Map<byte[], byte[]> hgetAll(byte[] key) {
		return (Map<byte[], byte[]>) executeRedis(new CallBack() {
			@Override
			public Map<byte[], byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.hgetAll(key);
			}
		});
	}
	
	public Long rpush(byte[] key, byte[] string) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.rpush(key, string);
			}
		});
	}

	public Long lpush(byte[] key, byte[] string) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lpush(key, string);
			}
		});
	}

	public Long llen(byte[] key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.llen(key);
			}
		});
	}
	
	public List<byte[]> lrange(byte[] key, int start, int end) {
		return (List<byte[]>) executeRedis(new CallBack() {
			@Override
			public List<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lrange(key, start, end);
			}
		});
	}
	
	public String ltrim(byte[] key, int start, int end) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.ltrim(key, start, end);
			}
		});
	}

	public byte[] lindex(byte[] key, int index) {
		return (byte[]) executeRedis(new CallBack() {
			@Override
			public byte[] doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lindex(key, index);
			}
		});
	}

	public String lset(byte[] key, int index, byte[] value) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lset(key, index, value);
			}
		});
	}

	public Long lrem(byte[] key, int count, byte[] value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lrem(key, count, value);
			}
		});
	}

	public byte[] lpop(byte[] key) {
		return (byte[]) executeRedis(new CallBack() {
			@Override
			public byte[] doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.lpop(key);
			}
		});
	}

	public byte[] rpop(byte[] key) {
		return (byte[]) executeRedis(new CallBack() {
			@Override
			public byte[] doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.rpop(key);
			}
		});
	}

	public Long sadd(byte[] key, byte[] member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.sadd(key, member);
			}
		});
	}

	public Set<byte[]> smembers(byte[] key) {
		return (Set<byte[]>) executeRedis(new CallBack() {
			@Override
			public Set<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.smembers(key);
			}
		});
	}

	public Long srem(byte[] key, byte[] member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.srem(key, member);
			}
		});
	}

	public byte[] spop(byte[] key) {
		return (byte[]) executeRedis(new CallBack() {
			@Override
			public byte[] doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.spop(key);
			}
		});
	}

	public Long scard(byte[] key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.scard(key);
			}
		});
	}

	public Boolean sismember(byte[] key, byte[] member) {
		return (Boolean) executeRedis(new CallBack() {
			@Override
			public Boolean doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.sismember(key, member);
			}
		});
	}

	public byte[] srandmember(byte[] key) {
		return (byte[]) executeRedis(new CallBack() {
			@Override
			public byte[] doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.srandmember(key);
			}
		});
	}

	public Long zadd(byte[] key, double score, byte[] member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zadd(key, score, member);
			}
		});
	}

	public Set<byte[]> zrange(byte[] key, int start, int end) {
		return (Set<byte[]>) executeRedis(new CallBack() {
			@Override
			public Set<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrange(key, start, end);
			}
		});
	}
	
	public Long zrem(byte[] key, byte[] member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrem(key, member);
			}
		});
	}

	public Double zincrby(byte[] key, double score, byte[] member) {
		return (Double) executeRedis(new CallBack() {
			@Override
			public Double doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zincrby(key, score, member);
			}
		});
	}
	
	public Long zrank(byte[] key, byte[] member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrank(key, member);
			}
		});
	}

	public Long zrevrank(byte[] key, byte[] member) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrank(key, member);
			}
		});
	}

	public Set<byte[]> zrevrange(byte[] key, int start, int end) {
		return (Set<byte[]>) executeRedis(new CallBack() {
			@Override
			public Set<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrange(key, start, end);
			}
		});
	}

	public Set<Tuple> zrangeWithScores(byte[] key, int start, int end) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrangeWithScores(key, start, end);
			}
		});
	}

	public Set<Tuple> zrevrangeWithScores(byte[] key, int start, int end) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrangeWithScores(key, start, end);
			}
		});
	}

	public Long zcard(byte[] key) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zcard(key);
			}
		});
	}

	public Double zscore(byte[] key, byte[] member) {
		return (Double) executeRedis(new CallBack() {
			@Override
			public Double doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zscore(key, member);
			}
		});
	}

	public List<byte[]> sort(byte[] key) {
		return (List<byte[]>) executeRedis(new CallBack() {
			@Override
			public List<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.sort(key);
			}
		});
	}

	public List<byte[]> sort(byte[] key, SortingParams sortingParameters) {
		return (List<byte[]>) executeRedis(new CallBack() {
			@Override
			public List<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.sort(key, sortingParameters);
			}
		});
	}

	public Long zcount(byte[] key, double min, double max) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zcount(key, min, max);
			}
		});
	}

	public Set<byte[]> zrangeByScore(byte[] key, double min, double max) {
		return (Set<byte[]>) executeRedis(new CallBack() {
			@Override
			public Set<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrangeByScore(key, min, max);
			}
		});
	}

	public Set<byte[]> zrangeByScore(byte[] key, double min, double max, int offset, int count) {
		return (Set<byte[]>) executeRedis(new CallBack() {
			@Override
			public Set<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrangeByScore(key, min, max, offset, count);
			}
		});
	}

	public Set<Tuple> zrangeByScoreWithScores(byte[] key, double min, double max) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrangeByScoreWithScores(key, min, max);
			}
		});
	}

	public Set<Tuple> zrangeByScoreWithScores(byte[] key, double min, double max, int offset, int count) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrangeByScoreWithScores(key, min, max, offset, count);
			}
		});
	}

	public Set<byte[]> zrevrangeByScore(byte[] key, double max, double min) {
		return (Set<byte[]>) executeRedis(new CallBack() {
			@Override
			public Set<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrangeByScore(key, max, min);
			}
		});
	}

	public Set<byte[]> zrevrangeByScore(byte[] key, double max, double min, int offset, int count) {
		return (Set<byte[]>) executeRedis(new CallBack() {
			@Override
			public Set<byte[]> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrangeByScore(key, max, min, offset, count);
			}
		});
	}

	public Set<Tuple> zrevrangeByScoreWithScores(byte[] key, double max, double min) {
		return (Set<Tuple>) executeRedis(new CallBack() {
			@Override
			public Set<Tuple> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zrevrangeByScoreWithScores(key, max, min);
			}
		});
	}

	public Set<Tuple> zrevrangeByScoreWithScores(byte[] key, double max, double min, int offset, int count) {
		Set<Tuple> result = null;
		ShardedJedis shardedJedis = redisDataSource.getRedisClient();
		if (shardedJedis == null) {
			return result;
		}
		boolean broken = false;
		try {

			result = shardedJedis.zrevrangeByScoreWithScores(key, max, min, offset, count);

		} catch (Exception e) {

			log.error(e.getMessage(), e);
			broken = true;
		} finally {
			redisDataSource.returnResource(shardedJedis, broken);
		}
		return result;
	}

	public Long zremrangeByRank(byte[] key, int start, int end) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zremrangeByRank(key, start, end);
			}
		});
	}

	public Long zremrangeByScore(byte[] key, double start, double end) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.zremrangeByScore(key, start, end);
			}
		});
	}

	public Long linsert(byte[] key, LIST_POSITION where, byte[] pivot, byte[] value) {
		return (Long) executeRedis(new CallBack() {
			@Override
			public Long doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.linsert(key, where, pivot, value);
			}
		});
	}

	public List<Object> pipelined(ShardedJedisPipeline shardedJedisPipeline) {
		return (List<Object>) executeRedis(new CallBack() {
			@Override
			public List<Object> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.pipelined(shardedJedisPipeline);
			}
		});
	}
	/**
	 * 根据key,使用hash算法找到对应的jedis对象
	 * @param key
	 * @return
	 */
	public Jedis getShard(byte[] key) {
		return (Jedis) executeRedis(new CallBack() {
			@Override
			public Jedis doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.getShard(key);
			}
		});
	}

	public Jedis getShard(String key) {
		return (Jedis) executeRedis(new CallBack() {
			@Override
			public Jedis doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.getShard(key);
			}
		});
	}

	public JedisShardInfo getShardInfo(byte[] key) {
		return (JedisShardInfo) executeRedis(new CallBack() {
			@Override
			public JedisShardInfo doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.getShardInfo(key);
			}
		});
	}

	public JedisShardInfo getShardInfo(String key) {
		ShardedJedis shardedJedis = redisDataSource.getRedisClient();
		JedisShardInfo result = null;
		if (shardedJedis == null) {
			return result;
		}
		boolean broken = false;
		try {
			result = shardedJedis.getShardInfo(key);
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			broken = true;
		} finally {
			redisDataSource.returnResource(shardedJedis, broken);
		}
		return result;
	}

	public String getKeyTag(String key) {
		return (String) executeRedis(new CallBack() {
			@Override
			public String doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.getKeyTag(key);
			}
		});
	}

	public Collection<JedisShardInfo> getAllShardInfo() {
		return (Collection<JedisShardInfo>) executeRedis(new CallBack() {
			@Override
			public Collection<JedisShardInfo> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.getAllShardInfo();
			}
		});
	}

	public Collection<Jedis> getAllShards() {
		return (Collection<Jedis>) executeRedis(new CallBack() {
			@Override
			public Collection<Jedis> doExecute(ShardedJedis shardedJedis) {
				return shardedJedis.getAllShards();
			}
		});
	}
}

测试

Spring整合redis