2015-07-02 3 views
0

Когда я использую Jedis как код ниже:Исключения С трубопроводом Jedis

public class JedisTest extends Sync { 
    private static final String _SET_KEY_1 = "test1"; 
    private static final String _SET_KEY_2 = "test2"; 

    public void process() throws SQLException { 
     Set<String> appSet = getAllUserableAppkey(); 
     final ShardedJedis jedis = RedisHelper.getJedis(); 
     final ShardedJedisPipeline pipeline = jedis.pipelined(); 

     for (String key : appSet) { 
      Set<String> result = jedis.smembers(_SET_KEY_1); 
      Set<String> result2 = jedis.smembers(_SET_KEY_2); 
      String rangName = String.format("%s::%s", "test", key); 
      for (int i = 0; i < 10; i++) { 
       pipeline.sadd(rangName, String.valueOf(i)); 
      } 
     } 
     pipeline.sync(); 
    } 

    public Set<String> getAllUserableAppkey() { 

    } 

    public static void main(String[] args) throws Exception { 
     DbHelper.init(); 
     RedisHelper.init(); 
     JedisTest jedisTest = new JedisTest(); 
     try { 
      jedisTest.process(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Это забросить исключение, как это:

Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.List 
    at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:224) 
    at redis.clients.jedis.Connection.getMultiBulkReply(Connection.java:217) 
    at redis.clients.jedis.Jedis.smembers(Jedis.java:1055) 
    at redis.clients.jedis.ShardedJedis.smembers(ShardedJedis.java:339) 
    at com.snda.sync.impl.test.JedisTest.process(JedisTest.java:29) 
    at com.snda.sync.impl.test.JedisTest.main(JedisTest.java:58) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

я могу изменить код, чтобы исправить, как:

public void process() throws SQLException { 
    Set<String> appSet = getAllUserableAppkey(); 
    final ShardedJedis jedis = RedisHelper.getJedis(); 
    for (String key : appSet) { 
     final ShardedJedisPipeline pipeline = jedis.pipelined(); 
     Set<String> result = jedis.smembers(_SET_KEY_1); 
     Set<String> result2 = jedis.smembers(_SET_KEY_2); 
     //log.warn("result1 :{},result2:{}",result,result2); 
     String rangName = String.format("%s::%s", "test", key); 
     for (int i = 0; i < 10; i++) { 
      pipeline.sadd(rangName, String.valueOf(i)); 
     } 
     pipeline.sync(); 
    } 
} 

Но я не знаю, почему это исключение бросает, делает pipline.sadd() конфликт с jedis.smembers? Спасибо, что ответили мне!

В Jedis является последним: 2.7.2

ответ

2

Вы не должны использовать экземпляр Jedis непосредственно во время конвейерный.

Трубопровод использует поток экземпляра Jedis (не инициализирует новый поток), а так как нормальная работа немедленно считывает ответ, а конвейер читает целые ответы позже, смешивая два режима использования, получает Jedis в проблему.

Р - Конвейерный/N - Нормальный

Запрос -> Р (1) Р (2) N (3) N (4) Р (5)

Redis отклика -> P (1) P (2) N (3) N (4) P (5)

Согласованный запрос-ответ -> N (1: должно быть 3) N (2: должно быть 4) P (3 : должно быть 1) P (4: должно быть 2) P (5)

Вы можете увидеть ответ может быть легко ошибочным.

+0

Благодарим вас за ответ, в первом примере кода я использую новый экземпляр jedis для нормальной работы, а другой - для работы с конвейером, и он сработал. – iameven

+0

Отлично! Рад был помочь. –

Смежные вопросы