1. 程式人生 > >redis分散式連線池程式碼實現

redis分散式連線池程式碼實現

redis分散式演算法原理:

本例中我們打開了兩個redis服務,一個6379埠,一個6380埠,那麼我們儲存資料的時候是怎麼分配的了,object1經過hsah到了他的位置上,存放到cacheA節點上,其它如object2,object3,object4也到了各自的位置,每個如cacheA的節點其實就是一個redis服務,順時針分配object1分配到了cacheA上,但是這樣有一個問題,那就是分配不均勻,所以就有了cacheA,cacheB,cacheC的虛擬節點(圖中沒有示例),每個虛擬節點的資料映射回自己的主節點,那麼資料的分配最大程度上就分配均勻了

1.redis分散式連線池

public
class RedisShardedPool { private static ShardedJedisPool pool;//Sharded Jedis連線池 private static Integer maxTotal = Integer.valueOf(PropertiesUtil.getProperty("redis.max.total","20")); //最大連線數 private static Integer maxIdle = Integer.valueOf(PropertiesUtil.getProperty("redis.max.idle","10"));//
在jedispool中最大的idle狀態(空閒的)的jedis例項的個數 private static Integer minIdle = Integer.valueOf(PropertiesUtil.getProperty("redis.min.idle","2"));//在jedispool中最小的idle狀態(空閒的)的jedis例項的個數 private static Boolean testOnBorrow = Boolean.valueOf(PropertiesUtil.getProperty("redis.test.borrow","true"));//在borrow一個Jedis例項的時候,是否要進行驗證操作,如果賦值true,那麼得到的jedis例項肯定是可用的
private static Boolean testOnReturn = Boolean.valueOf(PropertiesUtil.getProperty("redis.test.return","true"));//在borrow一個Jedis例項的時候,是否要進行驗證操作,如果賦值true,則放回jedispool的jedis例項肯定是可用的 private static String redis1Ip = PropertiesUtil.getProperty("redis1.ip"); private static Integer redis1Port = Integer.valueOf(PropertiesUtil.getProperty("redis1.port")); private static String redis2Ip = PropertiesUtil.getProperty("redis2.ip"); private static Integer redis2Port = Integer.valueOf(PropertiesUtil.getProperty("redis2.port")); private static void initPool(){ JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(maxTotal); config.setMaxIdle(maxIdle); config.setMinIdle(minIdle); config.setTestOnBorrow(testOnBorrow); config.setTestOnReturn(testOnReturn); config.setBlockWhenExhausted(true);//連線耗盡的時候是否阻塞,true:阻塞,false:丟擲異常 //pool = new JedisPool(config,redisIp,redisPort,1000*2); JedisShardInfo info1 = new JedisShardInfo(redis1Ip,redis1Port,1000*2); //info1.setPassword("ddddd");//如果有密碼的話 JedisShardInfo info2 = new JedisShardInfo(redis2Ip,redis2Port,1000*2); List<JedisShardInfo> jedisShardInfoList = new ArrayList<JedisShardInfo>(2); jedisShardInfoList.add(info1); jedisShardInfoList.add(info2); pool = new ShardedJedisPool(config,jedisShardInfoList, Hashing.MURMUR_HASH, Sharded.DEFAULT_KEY_TAG_PATTERN); } static { initPool(); } /* public static Jedis getJedis(){ return pool.getResource(); }*/ public static ShardedJedis getJedis(){ return pool.getResource(); } public static void returnBrokenResource(ShardedJedis jedis){ pool.returnBrokenResource(jedis); } public static void returnResource(ShardedJedis jedis){ pool.returnResource(jedis); } public static void main (String[] args){ ShardedJedis jedis = pool.getResource(); for (int i=0;i<10;i++){ jedis.set("key"+i,"value"+i); } //jedis.set("geelykey","geelyvalue"); returnResource(jedis); // pool.destroy();//臨時呼叫 System.out.println("program is end"); } }

2.寫一個工具類封裝redis分散式操作方法

public class RedisShardedPoolUtil {
    /*設定key的有效期,單位是秒*/
    public static Long expire(String key,int exTime){
        ShardedJedis jedis = null;
        Long result = null;

        try {
            jedis = RedisShardedPool.getJedis();
            result = jedis.expire(key,exTime);
        } catch (Exception e) {
            log.error("expire key:{} exTime:{}  error",key,exTime,e);
            RedisShardedPool.returnBrokenResource(jedis);
            return result;
        }
        RedisShardedPool.returnResource(jedis);
        return  result;

    }


    //exTime的單位是秒
    public static String setEx(String key,String value,int exTime){
        ShardedJedis jedis = null;
        String result = null;

        try {
            jedis = RedisShardedPool.getJedis();
            result = jedis.setex(key,exTime,value);
        } catch (Exception e) {
            log.error("setex key:{} exTime:{} value:{} error",key,exTime,value,e);
            RedisShardedPool.returnBrokenResource(jedis);
            return result;
        }
        RedisShardedPool.returnResource(jedis);
        return  result;

    }

    public static String set(String key,String value){
        ShardedJedis jedis = null;
        String result = null;

        try {
            jedis = RedisShardedPool.getJedis();
            result = jedis.set(key, value);
        } catch (Exception e) {
            log.error("set key:{} value:{} error",key,value,e);
            RedisShardedPool.returnBrokenResource(jedis);
            return result;
        }
        RedisShardedPool.returnResource(jedis);
        return  result;

    }

    public static String getSet(String key,String value){
        ShardedJedis jedis = null;
        String result = null;

        try {
            jedis = RedisShardedPool.getJedis();
            result = jedis.getSet(key, value);
        } catch (Exception e) {
            log.error("getSet key:{} value:{} error",key,value,e);
            RedisShardedPool.returnBrokenResource(jedis);
            return result;
        }
        RedisShardedPool.returnResource(jedis);
        return  result;

    }

    public static Long setnx(String key,String value){
        ShardedJedis jedis = null;
        Long result = null;

        try {
            jedis = RedisShardedPool.getJedis();
            result = jedis.setnx(key, value);
        } catch (Exception e) {
            log.error("set key:{} value:{} error",key,value,e);
            RedisShardedPool.returnBrokenResource(jedis);
            return result;
        }
        RedisShardedPool.returnResource(jedis);
        return  result;

    }

    public static String get(String key){
        ShardedJedis jedis = null;
        String result = null;

        try {
            jedis = RedisShardedPool.getJedis();
            result = jedis.get(key);
        } catch (Exception e) {
            log.error("get key:{} error",key,e);
            RedisShardedPool.returnBrokenResource(jedis);
            return result;
        }
        RedisShardedPool.returnResource(jedis);
        return  result;

    }

    public static Long del(String key){
        ShardedJedis jedis = null;
        Long result = null;

        try {
            jedis = RedisShardedPool.getJedis();
            result = jedis.del(key);
        } catch (Exception e) {
            log.error("del key:{} error",key,e);
            RedisShardedPool.returnBrokenResource(jedis);
            return result;
        }
        RedisShardedPool.returnResource(jedis);
        return  result;

    }

    public  static  void main (String[] args){
        Jedis jedis = RedisPool.getJedis();
        RedisPoolUtil.set("keyTest","value");
        String value = RedisPoolUtil.get("keyTest");
        RedisPoolUtil.setEx("kevex","valueex",60*10);
        RedisPoolUtil.expire("keyTest",60*20);
        RedisPoolUtil.del("keyTest");
        System.out.println("end");
    }





}