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. php-fpm 启动 关闭 进程逃逸 pid

    正常关闭失败 [root@d personas]# /etc/init.d/php-fpm stopGracefully shutting down php-fpm /etc/init.d/php-f ...

  2. JVM 的 Xms 和 Xmx 设置一样大小的内存容量

    4. [推荐]在线上生产环境,JVM 的 Xms 和 Xmx 设置一样大小的内存容量,避免在 GC 后调整堆 大小带来的压力. 现在,我们知道了Elasticsearch所公开的缓存和缓冲区,可以尝试 ...

  3. 【转】@javax.ws.rs Webservice注解

    用于webservice. 1.路径 @javax.ws.rs.Path 标识要请求的资源类或资源方法的uri路径. 例,@Path("animal"),表示下一层路径是anima ...

  4. 插叙LTE

  5. 编译java-cef

    javacef即java Chromium Embedded Framework,其功能是通过在java应用中嵌入谷歌浏览器内核Chromium. 编译java-cef的过程可参考以下文档及视频: h ...

  6. 常用模块一(os模块、序列化模块(json和pickle))

    一.os模块 os模块是与操作系统交互的一个接口. import os # 和文件和文件夹的操作有关 os.makedirs('dirname1/dirname2') # 可生成多层递归目录 os.r ...

  7. ajax跨域资源共享

    一.同域发送数据 略 二.跨域发送数据 1.存在的问题 1.什么是同源策略 同源策略阻止从一个域名上加载的脚本获取或操作另一个域名上的文档属性.也就是说,受到请求的 URL 的域名必须与当前 Web ...

  8. asp.net 利用Response.Filter 获取输出内容, 变更输出内容

    重写 Response.Filter 就可以获取或更新输出到浏览器的内容       资料: https://weblog.west-wind.com/posts/2009/Nov/13/Captur ...

  9. AJAX实现三级联动

    省市区三级联动插件: 主页面:为方便使用,不用写过多代码,只写一个id为sanji的div,若别的页面要用,只需写一个id为sanji的div,加载上jQuery与sanji.js文件即可 <! ...

  10. Linux doxygen的安装与使用

    1.安装doxygen 目前最新版本的的doxygen是doxygen1.8.13,安装包可以在官网上下载,网址是:http://www.stack.nl/~dimitri/doxygen/downl ...