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. jquery 操作动态添加的元素

    动态添加的元素,无法侦听到事件,写法如下: 使用函数.on 格式为: $(父元素).on('event','selector',function(){ //do something }) 例如 < ...

  2. <2013 07 31> 没有必然的理由

    <2013 07 31> 没有必然的理由 没有必然的理由 人类从野蛮走向文明 也可能,从野蛮走向更野蛮 没有必然的理由 人群从疯狂走向理智 也可能,从疯狂走向更疯狂 没有必然的理由 你我从 ...

  3. 【python】-- Django 分页 、cookie、Session、CSRF

    Django  分页 .cookie.Session.CSRF 一.分页 分页功能在每个网站都是必要的,下面主要介绍两种分页方式: 1.Django内置分页 from django.shortcuts ...

  4. k8s 安装文档

    k8s 安装文档 1.5 http://blog.csdn.net/bobpen/article/details/78958675

  5. 005-搭建框架-实现AOP机制【二】AOP技术

    一.什么是AOP aspect-oriented  programming,面向切面编程,对oop的一种补充. 著名示例,aspectj,spring+aspectj 二.aop之代码重构 2.1.代 ...

  6. Percona备份mysql全库及指定数据库(完整备份与增量备份)

    Percona Xtrabackup备份mysql全库及指定数据库(完整备份与增量备份) Xtrabackup简介 Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对I ...

  7. ZFI_VENDOR_CREATE

    创建供应商函数, 需要考虑是 G_TASK = I /U /M FUNCTION zfyj_vendor_create. *"-------------------------------- ...

  8. SaltStack远程执行命令

    编辑fansik_cmd.sls文件: 内容如下: fansik_cmd:  cmd.run:    - unless:      - test -f /tmp/fansik.txt      - t ...

  9. Python替换文件内容

    #!/usr/bin/env python import fileinput for line in fileinput.input('fansik',inplace=1): line = line. ...

  10. python中json.dumps使用的坑以及字符编码

    我们知道,python中的字符串分普通字符串和unicode字符串,一般从数据库中读取的字符串会自动被转换为unicode字符串 下面回到重点,使用json.dumps时,一般的用法为: >&g ...