2013-04-20 95 views
0
public class JedisPipeline { 
    private static JedisPool pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379); 
    public static void main(String args[]){ 

     Jedis jedis = pool.getResource(); 
     Pipeline pipeline = jedis.pipelined(); 
     pipeline.multi(); 
     //pipeline.hmset("Id", new HashMap<String,String>()); 
     for(int i=0; i < 1000 ; i++){ 
      pipeline.hincrBy("Id", i+"", i); 
     } 
     pipeline.exec(); 
     pool.returnResource(jedis); 
     //pool.destroy(); 

     //pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379); 
     jedis = pool.getResource(); 
     Map<String,String> map1 = jedis.hgetAll("Id"); 
     System.out.println("map1------->"+map1); 
     pool.returnResource(jedis); 
     //pool.destroy(); 


    } 
} 

我在上面的代码中有问题。它抛出一个ClassCastException,就像我销毁池并创建一个新的池对象,它可以正常工作。我是否正确使用Pipeline API?谁能帮我 ?我使用Jedis 2.1.0Jedis Pipeline Multi throw ClassCastException

Exception in thread "main" java.lang.ClassCastException: [B cannot be cast to java.util.List 
    at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:189) 
    at redis.clients.jedis.Jedis.hgetAll(Jedis.java:861) 
    at com.work.jedisex.JedisFactory.main(JedisFactory.java:59) 

修改代码来获得其抛出异常

Response<Map<String,String>> map1 = pipeline.hgetAll("Id"); 
pipeline.exec(); 
pipeline.sync(); 
pool.returnResource(jedis); 
Map<String,String> map2 = map1.get(); 

回答

1

貌似管道不执行exec()调用后没有关闭映射。因此,当您尝试在returnResource之后重用相同的Jedis对象时,它仍包含来自上一操作的pipelinedResponses。

尝试做这样:

pipeline.exec(); 
    pipeline.sync(); 
    pool.returnResource(jedis); 

同步()调用应该关闭管道。

+0

Thank you,That worked!。但是我已经修改了代码来获得如上所述的Map。我仍然得到同样的例外。你能找到代码中的问题吗? – user1182253 2013-04-22 05:56:22