【学会安装redis】

从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后进入redis-X.Y.Z文件夹后直接make即可,安装非常简单。

make成功后会在src文件夹下产生一些二进制可执行文件,包括redis-server、redis-cli等等:

代码如下:
$ find . -type f -executable
./redis-benchmark //用于进行redis性能测试的工具
./redis-check-dump //用于修复出问题的dump.rdb文件
./redis-cli //redis的客户端
./redis-server //redis的服务端
./redis-check-aof //用于修复出问题的AOF文件
./redis-sentinel //用于集群管理

【学会启动redis】

启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件:

代码如下:
./redis-server ../redis.conf

默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379。

【使用redis客户端】

代码如下:

//这样来启动redis客户端了
$ ./redis-cli
//用set指令来设置key、value
127.0.0.1:6379> set name "roc"
OK
//来获取name的值
127.0.0.1:6379> get name
"roc"
//通过客户端来关闭redis服务端
127.0.0.1:6379> shutdown
127.0.0.1:6379>

【redis数据结构 – 简介】

redis是一种高级的key:value存储系统,其中value支持五种数据类型:

1.字符串(strings):由于INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果
2.字符串列表(lists):lists的常用操作包括LPUSH、RPUSH、LRANGE等。我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。

  我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序。
  利用LRANGE还可以很方便的实现分页的功能。
  在博客系统中,每片博文的评论也可以存入一个单独的list中
3.字符串集合(sets)
4.有序字符串集合(sorted sets):很多时候,我们都将redis中的有序集合叫做zsets,这是因为在redis中,有序集合相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等等
5.哈希(hashes)

而关于key,有几个点要提醒大家:

1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
2.key也不要太短,太短的话,key的可读性会降低;
3.在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。

【聊聊redis的事务处理】

众所周知,事务是指“一个完整的动作,要么全部执行,要么什么也没有做”。

在聊redis事务处理之前,要先和大家介绍四个redis指令,即MULTI、EXEC、DISCARD、WATCH。这四个指令构成了redis事务处理的基础。

1.MULTI用来组装一个事务;
2.EXEC用来执行一个事务;
3.DISCARD用来取消一个事务;
4.WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。

 

 

redis存在的好处就在于无需频繁的访问数据库,当一些数据不会发生变化时可以直接添加到redis中,比如聊天一些历史记录等,类似于缓存,这样大大的提高了性能,建议在使用redis最好结合着数据库一起使用。

Redis使用示例:

int user_id = 2;//用户id
String user_name;//用户名
if(jedis.hexists("user"+user_id, "user_name")){//判断jedis中是否存在"user"+user_id哈希表并且value值为user_name
user_name =jedis.hget("user"+user_id, "user_name");//如果存在直接获取然后登陆
System.out.println("欢迎来到Redis登陆: "+user_name);
}else{//如果不存在,则需要查询数据库判断用户名密码是否正确,如果存在则登陆,并且将其信息保存至redis
String sql = "select user_name from user_t where id = "+user_id+"";
try {
ResultSet rs =  conn.createStatement().executeQuery(sql);
if(rs.next()){
jedis.hset("user"+user_id, "user_name", rs.getString("user_name"));//保存至redis中
System.out.println("欢迎来到MySql登陆: "+rs.getString("user_name"));
}else{
System.out.println("欢迎 注册");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Redis工具类:

/**
 * 
 */
package com.ai.toptea.basic.util;

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

import com.ai.toptea.basic.spring.IReloadablePropertyBean;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisSentinelPool;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Protocol;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.util.Pool;

/**
 * 
 * redis链接类
 * 
 * @author <a href="mailto:lihz2@asiainfo-linkage.com">FluteD</a>
 * @version 2014-4-10
 */
public class RedisUtil implements IReloadablePropertyBean {

    public static final int DB_TEMP = 0;
    public static final int DB_COMMON = 3;
    public static final int DB_SYSMGR = 4;
    public static final int DB_RESM = 5;
    public static final int DB_ITSM = 6;
    public static final int DB_BSM = 7;
    public static final int DB_KBM = 8;
    public static final int DB_CTLM = 9;
    public static final int DB_CCP = 10;

    // 所有的DB索引
    private static Map<String, String> DB = new HashMap<String, String>();

    private static Log log = LogFactory.getLog(RedisUtil.class);

    protected static Set<String> sentinels = new HashSet<String>();
    private static String sentinelsAddrs = "";
    private static String masterName = "topteaRedisMaster";
    private static String masterPass = "";

    /**
     * key="master_dbnum/slave_dbnum",value=JedisSentinelPool/JedisPool
     */
    private static Map<String, Pool<Jedis>> jedisPool = new HashMap<String, Pool<Jedis>>();// 连接池

    public static void init() {
        sentinels.clear();
        sentinels.addAll(Arrays.asList(sentinelsAddrs.split(",")));
        jedisPool.clear();

        DB.put("" + DB_TEMP, "0");
        DB.put("" + DB_COMMON, "3");
        DB.put("" + DB_SYSMGR, "4");
        DB.put("" + DB_RESM, "5");
        DB.put("" + DB_ITSM, "6");
        DB.put("" + DB_BSM, "7");
        DB.put("" + DB_KBM, "8");
        DB.put("" + DB_CTLM, "9");
    }

    /**
     * 建立连接池
     */
    private static synchronized JedisSentinelPool initMasterPool(int dbIndex) {
        if (sentinels.size() == 0) {
            init();
        }

        JedisSentinelPool jedisSentinelPool = getMasterPool(dbIndex);

        if (jedisSentinelPool != null)
            return jedisSentinelPool;

        if (DB.containsKey("" + dbIndex)) {
            jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, new GenericObjectPoolConfig(), Protocol.DEFAULT_TIMEOUT, masterPass,
                    dbIndex);

        } else {
            jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, masterPass);
            dbIndex = 0;

        }

        jedisPool.put("master_" + dbIndex, jedisSentinelPool);

        return jedisSentinelPool;
    }

    /**
     * 建立连接池
     */
    private static JedisPool initSlavePool() {
        JedisPool jedisSlavePool = getSlavePool();

        if (jedisSlavePool != null) {
            try {
                Jedis slave = jedisSlavePool.getResource();
                slave.close();

                return jedisSlavePool;
            } catch (JedisConnectionException e) {
                jedisSlavePool = null;
                log.error(e.getMessage(),e);
            }
            // return jedisSlavePool;
        }

        for (String sentinel : sentinels) {

            List<String> sentinelAddr = Arrays.asList(sentinel.split(":"));
            try {
                Jedis jedis = new Jedis(sentinelAddr.get(0), Integer.parseInt(sentinelAddr.get(1)));
                List<Map<String, String>> salves = jedis.sentinelSlaves(masterName);
                if (salves == null || salves.size() == 0) {
                    continue;
                }
                int randomIndex = 0;
                while (randomIndex < salves.size()) {

                    Map<String, String> salvesAttr = salves.get(randomIndex);

                    // 当slave处于下线状态或者连接不上时,flags字段里会有s_down,disconnected字样
                    String flages = salvesAttr.get("flags");
                    if (flages.indexOf("s_down") != -1 || flages.indexOf("disconnected") != -1) {
                        randomIndex++;
                        continue;
                    }

                    jedisSlavePool = new JedisPool(new GenericObjectPoolConfig(), salvesAttr.get("ip"), Integer.parseInt(salvesAttr.get("port")),
                            Protocol.DEFAULT_TIMEOUT, masterPass);
                    break;

                }
                jedis.close();
                break;
            } catch (JedisConnectionException e) {
                // log.info("Cannot connect to sentinel running @ " + sentinel + ". Trying next one.");
            }
        }

        if (jedisSlavePool == null) {
            try {
                Jedis master = getMasterResource(DB_TEMP);

                jedisSlavePool = new JedisPool(new GenericObjectPoolConfig(), master.getClient().getHost(), master.getClient().getPort(),
                        Protocol.DEFAULT_TIMEOUT, masterPass);

                returnMasterResource(master);
            } catch (Exception e) {
                log.error(e.getMessage(),e);
            }
        }

        jedisPool.put("slave", jedisSlavePool);

        return jedisSlavePool;
    }

    /**
     * 获取jedis资源,调用此方法后,使用完毕,需要调用returnMasterResource方法
     * 
     * @return
     * @throws Exception
     */
    public static Jedis getMasterResource(int dbIndex) throws Exception {
        JedisSentinelPool jedisSentinelPool = initMasterPool(dbIndex);

        Jedis jedis = null;
        int index = 0;
        while (index < 6) {
            try {
                jedis = jedisSentinelPool.getResource();
                int dbi = jedis.getDB().intValue();
                if (dbi != dbIndex)
                    jedis.select(dbIndex);

                break;
            } catch (JedisConnectionException e) {
                log.error(e.getMessage(),e);
                log.info("Cannot connect to redis master. Sleeping 5000ms and retrying..");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e1) {
                    log.error(e.getMessage(),e);
                }

            }
            index++;

            if (index >= 6) {
                log.info("Cannot connect to redis master.");
                throw new Exception("Cannot connect to redis master in 30s");
            }
        }

        return jedis;
    }

    /**
     * 获取jedis slave资源,调用此方法后,使用完毕,需要调用returnSlaveResource方法
     * 
     * @return
     */
    public static Jedis getSlaveResource() {
        JedisPool jedisSlavePool = initSlavePool();
        Jedis slave = null;
        try {
            slave = jedisSlavePool.getResource();
        } catch (JedisConnectionException e) {

        }
        return slave;
    }

    public static Jedis getSlaveResource(int dbIndex) {
        Jedis jedis = getSlaveResource();

        if (jedis != null) {
            jedis.select(dbIndex);
        }

        return jedis;
    }

    public static Jedis getJedisSlave(int dbIndex) {
        Jedis jedis = getSlaveResource();

        if (jedis != null) {
            jedis.select(dbIndex);
        }

        return jedis;
    }

    /**
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @throws Exception
     */
    public static String set(int dbIndex, String key, String value) throws Exception {
        Jedis jedis = null;
        String ret = "";
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.set(key, value);
                break;

            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }

        return ret;
    }

    public static String set(int dbIndex, byte[] key, byte[] value) throws Exception {
        Jedis jedis = null;
        String ret = "";
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.set(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 链表数组,左拼接
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long lpush(int dbIndex, String key, String... value) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lpush(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 链表数组,左拼接
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long lpush(int dbIndex, byte[] key, byte[]... value) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lpush(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 链表数组,左拼接
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long lpushx(int dbIndex, byte[] key, byte[]... value) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lpushx(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 链表数组,左拼接
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long lpushx(int dbIndex, String key, String value) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lpushx(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 链表数组,右拼接
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long rpush(int dbIndex, String key, String... value) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.rpush(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 链表数组,右拼接
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long rpushx(int dbIndex, String key, String... value) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.rpushx(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 链表数组,右拼接
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long rpush(int dbIndex, byte[] key, byte[]... value) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.rpush(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 链表数组,右拼接
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long rpushx(int dbIndex, byte[] key, byte[]... value) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.rpushx(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 从左侧开始获取链表数据
     * 
     * @param dbIndex
     * @param key
     * @param start
     * @param end
     * @return
     * @throws Exception
     */
    public static List<byte[]> lrange(int dbIndex, byte[] key, long start, long end) {
        Jedis jedis = null;
        List<byte[]> ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lrange(key, start, end);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        return ret;
    }

    /**
     * 从左侧开始获取链表数据
     * 
     * @param dbIndex
     * @param key
     * @param start
     * @param end
     * @return
     * @throws Exception
     */
    public static List<String> lrange(int dbIndex, String key, long start, long end) {
        Jedis jedis = null;
        List<String> ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lrange(key, start, end);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        return ret;
    }

    /**
     * 从右侧删除数据并返回
     * 
     * @param dbIndex
     * @param key
     * @return
     * @throws Exception
     */
    public static String rpop(int dbIndex, String key) {
        Jedis jedis = null;
        String ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.rpop(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        return ret;
    }

    /**
     * 从右侧删除数据并返回
     * 
     * @param dbIndex
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] rpop(int dbIndex, byte[] key) {
        Jedis jedis = null;
        byte[] ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.rpop(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        return ret;
    }

    /**
     * 从左侧删除数据并返回
     * 
     * @param dbIndex
     * @param key
     * @return
     * @throws Exception
     */
    public static String lpop(int dbIndex, String key) {
        Jedis jedis = null;
        String ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lpop(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        return ret;
    }

    /**
     * 从左侧删除数据并返回
     * 
     * @param dbIndex
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] lpop(int dbIndex, byte[] key) {
        Jedis jedis = null;
        byte[] ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lpop(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        return ret;
    }
    
    /**
     * 返回链表长度
     * @param dbIndex
     * @param key
     * @return
     */
    public static long llen(int dbIndex, byte[] key) {
        Jedis jedis = null;
        long ret = 0;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.llen(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        return ret;
    }
    

    /**
     * 返回链表长度
     * @param dbIndex
     * @param key
     * @return
     */
    public static long llen(int dbIndex, String key) {
        Jedis jedis = null;
        long ret = 0;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.llen(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        return ret;
    }

    /**
     * 删除指定数量(count)的指定项(value)
     * 
     * @param dbIndex
     * @param key
     * @param count
     * @param value
     * @return
     * @throws Exception
     */
    public static Long lrem(int dbIndex, String key, long count, String value) {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lrem(key, count, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        return ret;
    }

    /**
     * 删除指定数量(count)的指定项(value)
     * 
     * @param dbIndex
     * @param key
     * @param count
     * @param value
     * @return
     * @throws Exception
     */
    public static Long lrem(int dbIndex, byte[] key, long count, byte[] value) {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lrem(key, count, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        return ret;
    }

    /**
     * 更新制定位置(index)的值
     * 
     * @param dbIndex
     * @param key
     * @param index
     * @param value
     * @return
     * @throws Exception
     */
    public static String lset(int dbIndex, byte[] key, long index, byte[] value) throws Exception {
        Jedis jedis = null;
        String ret = null;
        int retryCount = 0;

        while (retryCount < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lset(key, index, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            retryCount++;
        }
        returnMasterResource(jedis);
        if (retryCount >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 更新制定位置(index)的值
     * 
     * @param dbIndex
     * @param key
     * @param index
     * @param value
     * @return
     * @throws Exception
     */
    public static String lset(int dbIndex, String key, long index, String value) throws Exception {
        Jedis jedis = null;
        String ret = null;
        int retryCount = 0;

        while (retryCount < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.lset(key, index, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            retryCount++;
        }
        returnMasterResource(jedis);
        if (retryCount >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long append(int dbIndex, String key, String value) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.append(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long append(int dbIndex, byte[] key, byte[] value) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.append(key, value);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 删除一个键值
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long del(int dbIndex, byte[] key) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.del(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 删除一个键值
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long del(int dbIndex, byte[]... key) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.del(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 删除一个键值
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long del(int dbIndex, String key) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.del(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 删除一个键值
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long del(int dbIndex, String... key) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.del(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 删除一个键值
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long hdel(int dbIndex, String key, String... fields) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.hdel(key, fields);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 删除一个键值
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long hdel(int dbIndex, byte[] key, byte[]... fields) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.hdel(key, fields);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 设置过期时间
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long expire(int dbIndex, String key, int seconds) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.expire(key, seconds);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 设置过期时间
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long expireAt(int dbIndex, String key, long unixTime) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.expireAt(key, unixTime);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 设置过期时间
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long expire(int dbIndex, byte[] key, int seconds) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.expire(key, seconds);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 设置过期时间
     * 
     * @param dbIndex
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public static Long expireAt(int dbIndex, byte[] key, long unixTime) throws Exception {
        Jedis jedis = null;
        Long ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.expireAt(key, unixTime);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }
        returnMasterResource(jedis);
        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * 获取一个键值
     * 
     * @param dbIndex
     * @param key
     * @return
     */
    public static String get(int dbIndex, String key) {
        Jedis jedis = null;
        String ret = null;

        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.get(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnSlaveResource(jedis);

        return ret;

    }

    public static String get(int dbIndex, String key, long startOffset, long endOffset) {
        Jedis jedis = null;
        String ret = null;

        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.getrange(key, startOffset, endOffset);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnSlaveResource(jedis);

        return ret;

    }

    public static String hget(int dbIndex, String key, String field) {
        Jedis jedis = null;
        String ret = "";
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.hget(key, field);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);
        return ret;
    }

    public static byte[] hget(int dbIndex, byte[] key, byte[] field) {
        Jedis jedis = null;
        byte[] ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.hget(key, field);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);
        return ret;
    }

    public static Map<byte[], byte[]> hgetAll(int dbIndex, byte[] key) {
        Jedis jedis = null;
        Map<byte[], byte[]> ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.hgetAll(key);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);
        return ret;
    }

    public static Map<String, String> hgetAll(int dbIndex, String key) {
        Jedis jedis = null;
        Map<String, String> ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.hgetAll(key);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }

        returnMasterResource(jedis);
        return ret;
    }

    public static boolean hexists(int dbIndex, String key, String field) {
        Jedis jedis = null;
        boolean ret = false;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.hexists(key, field);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }

        returnMasterResource(jedis);
        return ret;
    }

    public static boolean hexists(int dbIndex, byte[] key, byte[] field) {
        Jedis jedis = null;
        boolean ret = false;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.hexists(key, field);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }

        returnMasterResource(jedis);
        return ret;
    }

    public static boolean exists(int dbIndex, String key) {
        Jedis jedis = null;
        boolean ret = false;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.exists(key);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }

        returnMasterResource(jedis);
        return ret;
    }

    public static boolean exists(int dbIndex, byte[] key) {
        Jedis jedis = null;
        boolean ret = false;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.exists(key);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;
        }

        returnMasterResource(jedis);
        return ret;
    }

    public static Set<String> keys(int dbIndex, String pattern) {
        Jedis jedis = null;
        Set<String> ret = null;

        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.keys(pattern);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnSlaveResource(jedis);

        return ret;
    }

    public static Set<byte[]> keys(int dbIndex, byte[] pattern) {
        Jedis jedis = null;
        Set<byte[]> ret = null;

        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.keys(pattern);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnSlaveResource(jedis);

        return ret;
    }

    /**
     * 获取一个键值
     * 
     * @param dbIndex
     * @param key
     * @return
     */
    public static byte[] get(int dbIndex, byte[] key) {
        Jedis jedis = null;
        byte[] ret = null;

        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.get(key);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnSlaveResource(jedis);

        return ret;

    }

    public static byte[] get(int dbIndex, byte[] key, long startOffset, long endOffset) {
        Jedis jedis = null;
        byte[] ret = null;

        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.getrange(key, startOffset, endOffset);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnSlaveResource(jedis);

        return ret;

    }

    public static List<String> mget(int dbIndex, String... keys) {
        Jedis jedis = null;
        List<String> ret = null;

        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.mget(keys);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnSlaveResource(jedis);

        return ret;
    }

    public static List<byte[]> mget(int dbIndex, byte[]... keys) {
        Jedis jedis = null;
        List<byte[]> ret = null;

        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.mget(keys);
                break;
            } catch (Exception e) {
                log.info(e.getMessage());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnSlaveResource(jedis);

        return ret;
    }

    /**
     * map 结构
     * 
     * @param dbIndex
     * @param key
     * @param field
     * @param value
     * @return
     * @throws Exception
     */
    public static long hset(int dbIndex, String key, String field, String value) throws Exception {
        Jedis jedis = null;
        long ret = 0;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.hset(key, field, value);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    /**
     * map 结构
     * 
     * @param dbIndex
     * @param key
     * @param field
     * @param value
     * @return
     * @throws Exception
     */
    public static long hset(int dbIndex, byte[] key, byte[] field, byte[] value) throws Exception {
        Jedis jedis = null;
        long ret = 0;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.hset(key, field, value);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        if (index >= 3) {
            throw new Exception("Cannot save data to redis.");
        }
        return ret;
    }

    public static long sort(int dbIndex, String key, String dstkey) {
        Jedis jedis = null;
        long ret = 0;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.sort(key, dstkey);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    public static long sort(int dbIndex, byte[] key, byte[] dstkey) {
        Jedis jedis = null;
        long ret = 0;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.sort(key, dstkey);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    public static List<String> sort(int dbIndex, String key) {
        Jedis jedis = null;
        List<String> ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.sort(key);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    public static List<String> sort(int dbIndex, String key, SortingParams sp) {
        Jedis jedis = null;
        List<String> ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.sort(key, sp);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    public static long sort(int dbIndex, String key, SortingParams sp, String dstkey) {
        Jedis jedis = null;
        long ret = 0;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.sort(key, sp, dstkey);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    public static long sort(int dbIndex, byte[] key, SortingParams sp, byte[] dstkey) {
        Jedis jedis = null;
        long ret = 0;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.sort(key, sp, dstkey);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    public static List<byte[]> sort(int dbIndex, byte[] key) {
        Jedis jedis = null;
        List<byte[]> ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.sort(key);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    public static List<byte[]> sort(int dbIndex, byte[] key, SortingParams sp) {
        Jedis jedis = null;
        List<byte[]> ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.sort(key, sp);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    /**
     * 执行脚本
     * 
     * @param dbIndex
     * @param script
     * @return
     */
    public static Object eval(int dbIndex, String script, List<String> keys, List<String> args) {

        Jedis jedis = null;
        Object ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.eval(script, keys, args);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    /**
     * 执行脚本
     * 
     * @param dbIndex
     * @param script
     * @return
     */
    public static Object eval(int dbIndex, String script) {

        Jedis jedis = null;
        Object ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.eval(script);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    /**
     * 执行脚本
     * 
     * @param dbIndex
     * @param scriptShaId
     * @return
     */
    public static Object evalsha(int dbIndex, String scriptShaId, List<String> keys, List<String> args) {

        Jedis jedis = null;
        Object ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                if (jedis.scriptExists(scriptShaId))
                    ret = jedis.evalsha(scriptShaId, keys, args);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    /**
     * 执行脚本
     * 
     * @param dbIndex
     * @param scriptShaId
     * @return
     */
    public static Object evalsha(int dbIndex, String scriptShaId) {

        Jedis jedis = null;
        Object ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                if (jedis.scriptExists(scriptShaId))
                    ret = jedis.evalsha(scriptShaId);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    /**
     * 注册脚本
     * 
     * @param script
     * @return 脚本 sha id
     */
    public static String scriptLoad(int dbIndex, String script) {
        Jedis jedis = null;
        String ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                ret = jedis.scriptLoad(script);
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }

            }

            index++;

        }

        returnMasterResource(jedis);

        return ret;
    }

    /**
     * 管道方式,批量获取键值对象
     * 
     * @param dbIndex
     * @param keys
     * @return
     */
    public static List<Object> pipeGet(int dbIndex, String... keys) {
        Jedis jedis = null;
        List<Object> ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                Pipeline pipe = jedis.pipelined();
                for (String key : keys) {
                    pipe.get(key);
                }
                ret = pipe.syncAndReturnAll();
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnMasterResource(jedis);

        return ret;
    }

    public static List<Object> pipeGet(int dbIndex, List<String> keys) {
        if (keys == null)
            return null;
        
        return pipeGet(dbIndex, keys.toArray(new String[0]));
    }

    /**
     * 管道方式,批量获取键值对象
     * 
     * @param dbIndex
     * @param keys
     * @return
     */
    public static List<Object> pipeGet(int dbIndex, byte[]... keys) {
        Jedis jedis = null;
        List<Object> ret = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                Pipeline pipe = jedis.pipelined();
                for (byte[] key : keys) {
                    pipe.get(key);
                }
                ret = pipe.syncAndReturnAll();
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnMasterResource(jedis);

        return ret;
    }
    
    /**
     * 管道方式删除键值对
     * @param dbIndex
     * @param keysPattern 可以用前缀加*匹配多个,如:users*表示删除users开头的
     * @return
     */
    public static void pipeDel(int dbIndex, String keysPattern) {
        Jedis jedis = null;
        int index = 0;

        while (index < 3) {
            try {
                jedis = getJedisMaster(dbIndex);
                Set<String> keys = jedis.keys(keysPattern);
                Pipeline pipe = jedis.pipelined();
                for (String key : keys) {
                    pipe.del(key);
                }
                pipe.sync();
                break;
            } catch (Exception e) {
                log.error(e.getMessage(),e);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    log.error(e1.getMessage(),e1);
                }
            }

            index++;
        }
        returnMasterResource(jedis);

    }



    /**
     * 获取一个指定数据库的Jedis
     * 
     * @param dbIndex
     *            数据库编号
     * @return
     * @throws Exception
     */
    public static Jedis getJedisMaster(int dbIndex) throws Exception {
        Jedis jedis = getMasterResource(dbIndex);
        return jedis;
    }

    public static Jedis getCommonJedisMaster() {
        Jedis jedis = null;
        try {
            jedis = getJedisMaster(DB_COMMON);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return jedis;
    }

    public static Jedis getSysmgrJedisMaster() {
        Jedis jedis = null;
        try {
            jedis = getJedisMaster(DB_SYSMGR);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return jedis;
    }

    public static Jedis getItsmJedisMaster() {
        Jedis jedis = null;
        try {
            jedis = getJedisMaster(DB_ITSM);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return jedis;
    }

    public static Jedis getResmJedisMaster() {
        Jedis jedis = null;
        try {
            jedis = getJedisMaster(DB_RESM);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return jedis;
    }

    public static Jedis getKbmJedisMaster() {
        Jedis jedis = null;
        try {
            jedis = getJedisMaster(DB_KBM);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return jedis;
    }

    public static Jedis getBsmJedisMaster() {
        Jedis jedis = null;
        try {
            jedis = getJedisMaster(DB_BSM);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return jedis;
    }

    /**
     * 归还jedis资源
     * 
     * @param jedis
     */
    public static void returnMasterResource(Jedis jedis) {
        if (jedis == null)
            return;
        jedis.close();
        // Long db = jedis.getDB();
        //
        // JedisSentinelPool jedisSentinelPool = getMasterPool(db.intValue());
        //
        // if (jedisSentinelPool == null)
        // return;

        // jedisSentinelPool.returnResource(jedis);
    }

    /**
     * 归还jedis slave资源
     * 
     * @param jedis
     */
    public static void returnSlaveResource(Jedis jedis) {
        if (jedis == null)
            return;
        jedis.close();
        // JedisPool jedisSlavePool = getSlavePool();
        //
        // if (jedisSlavePool == null)
        // return;

        // jedisSlavePool.returnResource(jedis);
    }

    /**
     * @deprecated 对于我们的环境,连接池建立后一般不会销毁
     */
    public static void destroyMasterPool(int dbIndex) {
        JedisSentinelPool jedisSentinelPool = getMasterPool(dbIndex);
        if (jedisSentinelPool == null)
            return;

        jedisSentinelPool.destroy();
    }

    private static JedisSentinelPool getMasterPool(int dbIndex) {
        JedisSentinelPool jedisSentinelPool = null;
        if (!DB.containsKey("" + dbIndex))
            dbIndex = DB_TEMP;
        if (!jedisPool.containsKey("master_" + dbIndex))
            return null;

        jedisSentinelPool = (JedisSentinelPool) jedisPool.get("master_" + dbIndex);
        return jedisSentinelPool;
    }

    private static JedisPool getSlavePool() {
        JedisPool jedisSlavePool = null;
        jedisSlavePool = (JedisPool) jedisPool.get("slave");
        return jedisSlavePool;
    }

    /**
     * @param sentinelsAddrs
     *            the sentinelsAddrs to set
     */
    public static void setSentinelsAddrs(String sentinelsAddrs) {
        RedisUtil.sentinelsAddrs = sentinelsAddrs;
    }

    /**
     * @param masterPass
     *            the masterPass to set
     */
    public static void setMasterPass(String masterPass) {
        RedisUtil.masterPass = masterPass;
    }

    /**
     * @param masterName
     *            the masterName to set
     */
    public static void setMasterName(String masterName) {
        RedisUtil.masterName = masterName;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.ai.toptea.basic.spring.IReloadablePropertyBean#beforePropertyReload(java.lang.String, java.lang.String)
     */
    @Override
    public void beforePropertyReload(String propertyName, String newValue) {

    }

    /*
     * (non-Javadoc)
     * 
     * @see com.ai.toptea.basic.spring.IReloadablePropertyBean#afterPropertyReload(java.lang.String, java.lang.String)
     */
    @Override
    public void afterPropertyReload(String propertyName, String newValue) {
        // 没有变更直接返回
        if ("sentinelsAddrs".equals(propertyName) && RedisUtil.sentinelsAddrs.equals(newValue))
            return;
        if ("masterPass".equals(propertyName) && RedisUtil.masterPass.equals(newValue))
            return;
        if ("masterName".equals(propertyName) && RedisUtil.masterName.equals(newValue))
            return;
        init();
    }

}