redis-cluster集羣模式下使用pipeline,mget,mset批量操做

前言:

     Redis在3.0版正式引入了集羣這個特性,擴展變得很是簡單。然而當你開心的升級到3.0後,卻發現有些很好用的功能如今工做不了了, 好比咱們今天要聊的pipeline功能等批量操做。html

解決方式:

部署筆記:git

./redis-server ../cluster/7111/redis-7111.conf 
./redis-server ../cluster/7112/redis-7112.conf 
./redis-server ../cluster/7113/redis-7113.conf 
./redis-server ../cluster/7114/redis-7114.conf 
./redis-server ../cluster/7115/redis-7115.conf 
./redis-server ../cluster/7116/redis-7116.conf 

使用redis-trib.rb來初始化集羣,形如:
ruby  redis-trib.rb  create  --replicas  1  127.0.0.1:7111
	127.0.0.1:7112 127.0.0.1:7113 127.0.0.1:7114 127.0.0.1:7115
	127.0.0.1:7116

解決嘗試開始:github

使用spring-data-redis(推薦,簡單) redis

//pop a specified number of items from a queue
List<Object> results = stringRedisTemplate.executePipelined(
  new RedisCallback<Object>() {
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
      StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
      for(int i=0; i< batchSize; i++) {
        stringRedisConn.rPop("myqueue");
      }
    return null;
  }
});

可是這種仍是隻支持單節點,那怎麼辦呢?spring

能夠使用客戶端分片集羣,就天然沒有上面的這個問題啦,另外也能夠嘗試使用阿里雲redisruby

若是你必定要使用官方集羣,又不用其餘版本,那能夠解決嗎?答案是確定的。學習

方式一(本身擴展實現):優化

參考博文:http://www.cnblogs.com/drwong/p/4825752.html阿里雲

方式二:(githup現成的)spa

https://github.com/youaremoon/jedis-ext

關於mget,mset等操做(redis3.2.5高版本支持)

Long msetnx = jedisCluster.msetnx(
                "{" + prefix + KEY_SPLIT + "}" + "name", "張三",
                "{" + prefix + KEY_SPLIT + "}" + "age", "23",
                "{" + prefix + KEY_SPLIT + "}" + "address", "adfsa",
                "{" + prefix + KEY_SPLIT + "}" + "score", "100");
        System.out.println(msetnx);

        System.out.println(jedisCluster.mget(
                "{" + prefix + KEY_SPLIT + "}" + "name",
                "{" + prefix + KEY_SPLIT + "}" + "age",
                "{" + prefix + KEY_SPLIT + "}" + "address",
                "{" + prefix + KEY_SPLIT + "}" + "score"));//[張三, 23, adfsa, 100]

        //name這個key已經存在,因爲mset是原子的,該條指令將所有失敗
        msetnx = jedisCluster.msetnx(
                "{" + prefix + KEY_SPLIT + "}" + "phone", "110",
                "{" + prefix + KEY_SPLIT + "}" + "name", "張三",
                "{" + prefix + KEY_SPLIT + "}" + "abc", "asdfasfdsa");
        System.out.println(msetnx);


        System.out.println(jedisCluster.mget(
                "{" + prefix + KEY_SPLIT + "}" + "name",
                "{" + prefix + KEY_SPLIT + "}" + "age",
                "{" + prefix + KEY_SPLIT + "}" + "address",
                "{" + prefix + KEY_SPLIT + "}" + "score",
                "{" + prefix + KEY_SPLIT + "}" + "phone",
                "{" + prefix + KEY_SPLIT + "}" + "abc"));//[張三, 23, adfsa, 100, null, null]
    }

參考博文:

redis集羣客戶端JedisCluster優化 - 管道(pipeline)模式支持

redis-cluster官方集羣模式下使用pipeline批量操做

Redis學習筆記(五)jedis(JedisCluster)操做Redis集羣 redis-cluster

相關文章
相關標籤/搜索