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

Jedis的八种调用方式(功能:事务,管道)的更多相关文章

  1. 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍

    转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...

  2. Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

    jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...

  3. Java客户端Jedis的八种调用方式

      redis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分 ...

  4. 9、redis之事务2-Jedis的八种调用方式(事务、管道、分布式)介绍

    1.普通同步 @Test public void test1Normal() { Jedis jedis = new Jedis("localhost"); long start ...

  5. 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

    1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:    ...

  6. 【转】SVG与HTML、JavaScript的三种调用方式

    原文:https://www.cnblogs.com/guohu/p/5085045.html SVG与HTML.JavaScript的三种调用方式 一.在HTMl中访问SVG的DOM 1 2 3 4 ...

  7. Selenium Webdriver元素定位的八种常用方式

    楼主原创,欢迎学习和交流,码字不容易,转载请注明出处,谢谢. 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素 ...

  8. Selenium Webdriver元素定位的八种常用方式(转载)

    转载自 https://www.cnblogs.com/qingchunjun/p/4208159.html 在使用selenium webdriver进行元素定位时,通常使用findElement或 ...

  9. JS高级. 06 缓存、分析解决递归斐波那契数列、jQuery缓存、沙箱、函数的四种调用方式、call和apply修改函数调用方法

    缓存 cache 作用就是将一些常用的数据存储起来 提升性能 cdn //-----------------分析解决递归斐波那契数列<script> //定义一个缓存数组,存储已经计算出来 ...

随机推荐

  1. 修改已生成项目app名称

    在搜索里添加product Name,然后修改成你需要的app名称 修改完后可能会报错误如下 原因是test的测试路径发生了变化,其实如果不修改Test host的路径保留原来的重命名之前的app也是 ...

  2. linux linux 互传文件 win 不通过 ftp sftp 往linux 传文件(文件夹)

    linux 传入 传出文件 swp  port  22 怎样通过swp通过docker 容器向外传文件 通过scp Linux互传文件,需要知道文件源 file source 所在系统的ip wuse ...

  3. SQL SERVER临时表的使用

    SQL SERVER临时表的使用 drop table #Tmp   --删除临时表#Tmpcreate table #Tmp --创建临时表#Tmp(    ID   int IDENTITY (1 ...

  4. 流畅的python python 序列

    内置序列 容器类型 list .tuple和collections.deque这些序列能放入不同的类型的数据 扁平序列 str.byets.bytearray.memoryview(内存视图)和arr ...

  5. 视频解码芯片SAA7111A的初始化

    为了完成SAA7111A的初始化,FPGA需要完成I2C控制器的设计. 之前本科的时候初步接触过I2C,但是编写一个Verilog的控制器还是觉得有点难度的.说实话,那时候都无从下手,对实现这样一个协 ...

  6. Python基础(14)_python模块之configparser模块、suprocess

    9.configparser模块 模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值). 常见的软件格式文档格式如下: [D ...

  7. oracle数据向历史表数据迁移————procedure

    create or replace procedure remove_refund_his_pro isbegin declare cursor refund_query_cur is select ...

  8. java生成字符串的MD5值

    下面的代码实现了MD5值的生成: public class MD5Test2 { public static void main(String[] args) { System.out.println ...

  9. 07_Warning $HADOOP_HOME is deprecated.去除办法

    Warning $HADOOP_HOME is deprecated.去除办法 警告的出现: 解决方案: 第一种: 去除[/etc/profile]文件中[export HADOOP_HOME=/op ...

  10. QT 数字图像处理 笔记一

    1.被有符号整数和无符号整数十足的坑了一上午.我在实现图像旋转的时候先把坐标轴中心平移到图像中心:painter.translate(up_x+temp_w,up_y+temp_h);注意这里面各个数 ...