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. Objective-c 单例模式

    用GCD写Objective-c的单例模式和C#有比较大的区别 声明h文件 #import <Foundation/Foundation.h> @interface me : NSObje ...

  2. Adjacency List

    w Python Patterns - Implementing Graphs | Python.orghttps://www.python.org/doc/essays/graphs/ Graph ...

  3. text files and binary files

    https://en.wikipedia.org/wiki/Text_file https://zh.wikipedia.org/wiki/文本文件

  4. Jsp页面截取字符串

    用jstl标签: 首先页面中引入<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions ...

  5. Grunt自动化工具相关

    Grunt 项目中安装grunt模块npm install grunt --save,删除模块 npm uninstall grunt ,缺失某个插件:npm install grunt-contri ...

  6. 请听一个故事------>你真的认为iPhone只是一部手机?苹果惊天秘密!!

    在网上看到的一篇小说,感觉有点意思,转载过来大家一起围观下,作者很幽默很风趣. 导读:iPhone的隐藏功能!Jobs的军方身份!图灵服毒自杀的传奇故事!中兴华为的神秘背景! 你真的认为iPhone只 ...

  7. app开发流程有哪些

    app开发流程是需求方和供求方相互协调的过程,一般分为需求分析.功能设计.功能实现.项目测试.上线等几个步骤,下面我们就来一起看看ytkah团队进行app开发各个流程主要做哪些事情,让您对app开发设 ...

  8. Network Basic Knowledge

    @1: 应用层的常用协议以及对应的端口号: DNS 53/tcp/udp SMTP 25/tcp POP3 110/tcp HTTP 80/tcp HTTPS 443/udp TELNET 23/tc ...

  9. JAVA 遍历文件夹下文件并更改文件名称

    周末因为一些原因,需要批量更改一些文件的名称,使其随机,就随手写了点代码. 增加一个随机字母: public static void changeName(String path){ File fil ...

  10. Android 工具类 SharedPreferences 封装

    SharedPreferences 是 Android 数据存储方式中的一种,特别适合用来存储少量的.格式简单的数据,比如应用程序的各种配置信息,如是否打开音效,是否开启震动等等. SharedPre ...