Jedis的八种调用方式(功能:事务,管道)

    1. packagecom.irwin.redis;
    2.  
    3. importjava.util.Arrays;
    4. importjava.util.List;
    5.  
    6. importorg.junit.Test;
    7.  
    8. importredis.clients.jedis.Jedis;
    9. importredis.clients.jedis.JedisPoolConfig;
    10. importredis.clients.jedis.JedisShardInfo;
    11. importredis.clients.jedis.Pipeline;
    12. importredis.clients.jedis.ShardedJedis;
    13. importredis.clients.jedis.ShardedJedisPipeline;
    14. importredis.clients.jedis.ShardedJedisPool;
    15. importredis.clients.jedis.Transaction;
    16.  
    17. publicclassRedisConnectKindsTests{
    18. Jedisjedis=newJedis("192.168.56.101",6379);
    19.  
    20. //普通同步方式
    21. //最简单和基础的调用方式,每次执行命令后都可以返回结果,标记是否成功
    22. @Test
    23. publicvoidtestNormal(){
    24.  
    25. longstart=System.currentTimeMillis();
    26. for(inti=0;i<5;i++){
    27. Stringresult=jedis.set("n"+i,"n"+i);
    28. System.out.println(result);
    29. }
    30. longend=System.currentTimeMillis();
    31. System.out.println("SimpleSET:"+((end-start)/1000.0)+"seconds");
    32. jedis.disconnect();
    33. }
    34.  
    35. //事务方式
    36. //保障一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令
    37. //调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。
    38. //另外,事务中某个操作失败,并不会回滚其他操作。这一点需要注意。还有,我们可以使用discard()方法来取消事务。
    39. @Test
    40. publicvoidtest2Transactions(){
    41. longstart=System.currentTimeMillis();
    42. Transactiontx=jedis.multi();
    43. for(inti=0;i<10;i++){
    44. tx.set("t"+i,"t"+i);
    45. }
    46. System.out.println(jedis.watch("t1","t2"));
    47.  
    48. //tx.discard();
    49. List<Object>results=tx.exec();
    50. longend=System.currentTimeMillis();
    51. jedis.disconnect();
    52. }
    53.  
    54. //管道
    55. //要采用异步方式,一次发送多个指令,不同步等待其返回结果
    56. @Test
    57. publicvoidtest3Pipelined(){
    58. Pipelinepipeline=jedis.pipelined();
    59. for(inti=0;i<10;i++){
    60. pipeline.set("p"+i,"p"+i);
    61. }
    62. List<Object>results=pipeline.syncAndReturnAll();
    63. for(Objectobject:results){
    64. System.out.println(object);
    65. }
    66. jedis.disconnect();
    67. }
    68.  
    69. //管道中调用事务
    70. //Jedis提供的方法而言,是可以做到在管道中使用事务
    71. @Test
    72. publicvoidtest4combPipelineTrans(){
    73. Pipelinepipeline=jedis.pipelined();
    74. pipeline.multi();
    75.  
    76. for(inti=0;i<10;i++){
    77. pipeline.set(""+i,""+i);
    78. }
    79.  
    80. List<Object>results=pipeline.syncAndReturnAll();
    81. jedis.disconnect();
    82. }
    83.  
    84. //分布式直连同步调用
    85. //分布式直接连接,并且是同步调用,每步执行都返回执行结果。类似地,还有异步管道调用
    86. @Test
    87. publicvoidtest4ShardNormal(){
    88. List<JedisShardInfo>shards=Arrays.asList(
    89. newJedisShardInfo("192.168.56.101",6379),
    90. newJedisShardInfo("192.168.56.101",6179)
    91. );
    92.  
    93. ShardedJedissharding=newShardedJedis(shards);
    94.  
    95. for(inti=0;i<10;i++){
    96. Stringresult=sharding.set("sn"+i,"n"+i);
    97. System.out.println(result);
    98. }
    99. sharding.disconnect();
    100. }
    101.  
    102. //分布式直连异步调用
    103. @Test
    104. publicvoidtest6shardpipelined(){
    105. List<JedisShardInfo>shards=Arrays.asList(
    106. newJedisShardInfo("192.168.56.101",6379),
    107. newJedisShardInfo("192.168.56.101",6179)
    108. );
    109.  
    110. ShardedJedissharding=newShardedJedis(shards);
    111.  
    112. ShardedJedisPipelinepipeline=sharding.pipelined();
    113. longstart=System.currentTimeMillis();
    114. for(inti=0;i<100000;i++){
    115. pipeline.set("sp"+i,"p"+i);
    116. }
    117. List<Object>results=pipeline.syncAndReturnAll();
    118. longend=System.currentTimeMillis();
    119. System.out.println("Pipelined@SharingSET:"+((end-start)/1000.0)+"seconds");
    120.  
    121. sharding.disconnect();
    122. }
    123.  
    124. //分布式连接池同步调用
    125. //分布式调用代码是运行在线程中,那么上面两个直连调用方式就不合适了,
    126. //因为直连方式是非线程安全的,这个时候,你就必须选择连接池调用
    127. @Test
    128. publicvoidtest7shardSimplePool(){
    129. List<JedisShardInfo>shards=Arrays.asList(
    130. newJedisShardInfo("192.168.56.101",6379),
    131. newJedisShardInfo("192.168.56.101",6179)
    132. );
    133.  
    134. ShardedJedisPoolpool=newShardedJedisPool(newJedisPoolConfig(),shards);
    135.  
    136. ShardedJedisone=pool.getResource();
    137.  
    138. longstart=System.currentTimeMillis();
    139. for(inti=0;i<10;i++){
    140. Stringresult=one.set("spn"+i,"n"+i);
    141. System.out.println(result);
    142. }
    143. longend=System.currentTimeMillis();
    144. pool.returnResource(one);
    145. System.out.println("Simple@PoolSET:"+((end-start)/1000.0)+"seconds");
    146.  
    147. pool.destroy();
    148. }
    149.  
    150. //分布式连接池异步调用
    151. @Test
    152. publicvoidtest8shardPipelinedPool(){
    153. List<JedisShardInfo>shards=Arrays.asList(
    154. newJedisShardInfo("192.168.56.101",6379),
    155. newJedisShardInfo("192.168.56.101",6179)
    156. );
    157.  
    158. ShardedJedisPoolpool=newShardedJedisPool(newJedisPoolConfig(),shards);
    159.  
    160. ShardedJedisone=pool.getResource();
    161.  
    162. ShardedJedisPipelinepipeline=one.pipelined();
    163.  
    164. longstart=System.currentTimeMillis();
    165. for(inti=0;i<100000;i++){
    166. pipeline.set("sppn"+i,"n"+i);
    167. }
    168. List<Object>results=pipeline.syncAndReturnAll();
    169. longend=System.currentTimeMillis();
    170. pool.returnResource(one);
    171. System.out.println("Pipelined@PoolSET:"+((end-start)/1000.0)+"seconds");
    172. pool.destroy();
    173. }
    174. }

总结:

1、事务和管道都是异步模式。在事务和管道中不能同步查询结果。

2、事务和管道都是异步的,个人感觉,在管道中再进行事务调用,没有必要,不如直接进行事务模式。

3、分布式中,连接池的性能比直连的性能略好

4、分布式调用中不支持事务。

5、因为事务是在服务器端实现,而在分布式中,每批次的调用对象都可能访问不同的机器,所以,没法进行事务。

 

posted @ 2015-07-09 14:04  Uncle_Nucky  阅读(737)  评论(0编辑  收藏  举报