转载地址:http://blog.csdn.net/liyantianmin/article/details/51613772

1、Pipeline

利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而Redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。所以pipeline适合批处理作业可以提升效率如:

  1. public static void testMget() {
  2. Jedis jedis = RedisCacheClient.getInstrance().getClient();
  3. Set<String> keys = jedis.keys("cvfeedBackHandl_*");
  4. List<String> result = Lists.newArrayList();
  5. long t1 = System.currentTimeMillis();
  6. for (String key : keys) {
  7. result.add(jedis.get(key));
  8. }
  9. for (String src : result) {
  10. System.out.println(src);
  11. }
  12. System.out.println(System.currentTimeMillis() - t1);
  13. }
  14. public static void testPipline() {
  15. Jedis jedis = RedisCacheClient.getInstrance().getClient();
  16. Set<String> keys = jedis.keys("cvfeedBackHandl_*");
  17. List<Object> result = Lists.newArrayList();
  18. Pipeline pipelined = jedis.pipelined();
  19. long t1 = System.currentTimeMillis();
  20. for (String key : keys) {
  21. pipelined.<span style="font-family: Arial;">get</span>("testabcd");
  22. }
  23. result = pipelined.syncAndReturnAll();
  24. for (Object src : result) {
  25. System.out.println(src);
  26. }
  27. System.out.println(System.currentTimeMillis() - t1);
  28. }

如第一个方法执行的时间是82ms

第二个方法执行的时间是9ms

注意:pipeline和事务都是异步调用返回结果的,即并不是等待每条命令执行完立马返回结果而是等待所有命令执行完之后再返回结果。pipelined.syncAndReturnAll()返回的是参与打包执行的每条命令的结果。如果上面改成:

  1. for (String key : keys) {//keys长度为5
  2. pipelined.get(key);
  3. pipelined.del("testabcd");
  4. }

返回结果将是

  1. "test1"
  2. 1
  3. "test2"
  4. 0
  5. "test2"
  6. 0
  7. "test4"
  8. 0
  9. "test5"
  10. 0

2、事务

事务是保证事务内的所有命令是原子操作,一般配合watch使用,事务的执行结果和pipeline一样都是采用异步的方式获取结果,multi.exec()提交事务,如果执行成功,其返回的结果和pipeline一样是所有命令的返回值,如果事务里面有两个命令那么事务的exec返回值会把两个命令的返回值组合在一起返回。如果事务被取消返回null。

3、watch

一般是和事务一起使用,当对某个key进行watch后如果其他的客户端对这个key进行了更改,那么本次事务会被取消,事务的exec会返回null。jedis.watch(key)都会返回OK
eg:

  1. public static void testWach(){
  2. Jedis jedis = RedisCacheClient.getInstrance().getClient();
  3. String watch = jedis.watch("testabcd");
  4. System.out.println(Thread.currentThread().getName()+"--"+watch);
  5. Transaction multi = jedis.multi();
  6. multi.set("testabcd", "23432");
  7. try {
  8. Thread.sleep(3000);
  9. } catch (InterruptedException e) {
  10. e.printStackTrace();
  11. }
  12. List<Object> exec = multi.exec();
  13. System.out.println("---"+exec);
  14. jedis.unwatch();
  15. }
  16. public static void testWatch2(){
  17. Jedis jedis = RedisCacheClient.getInstrance().getClient();
  18. String watch = jedis.watch("testabcd2");
  19. System.out.println(Thread.currentThread().getName()+"--"+watch);
  20. Transaction multi = jedis.multi();
  21. multi.set("testabcd", "125");
  22. List<Object> exec = multi.exec();
  23. System.out.println("--->>"+exec);
  24. }

Thread-2--OK
Thread-0--OK
--->>[OK]

---null//事务取消

4、事务与管道

当对某个key进行watch时,如果其他的客户端对key进行了更改事务可以做到取消事务操作但是管道不可以

【转载】Jedis对管道、事务以及Watch的操作详细解析的更多相关文章

  1. 征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)

    有日子没写博客了,真的是忙得要疯掉. 完成项目基础架构搭建工作,解决了核心技术问题,接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: 征服 Redis 征服 Redis + J ...

  2. 【转载】微软官方提供的Sqlserver数据库操作帮助类SQLHelper类

    在.NET平台中,C#语言一般使用ADO.NET组件来操作Sqlserver数据库,通过ADO.NET组件可以实现连接数据库.查询数据集.执行SQL语句以及关闭数据库连接等操作,为此网上有很多开发者自 ...

  3. spring-data-redis的事务操作深度解析--原来客户端库还可以攒够了事务命令再发?

    一.官方文档 简单介绍下redis的几个事务命令: redis事务四大指令: MULTI.EXEC.DISCARD.WATCH. 这四个指令构成了redis事务处理的基础. 1.MULTI用来组装一个 ...

  4. MySQL线上执行大事务或锁表操作

    前提 在线执行一些大事务或锁表操作(给某个核心级表加一列或者执行修改操作),此时不但主库从库要长时间锁表,主从延迟也会变大.未避免大事务sql对整个集群产生影响,,我们希望一条SQL语句只在Maste ...

  5. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  6. MySQL 事务配置命令行操作和持久化

    MySQL 事务配置命令行操作和持久化 参考 MySQL 官方参考手册 提供 5.5 5.6 5.7 8.0 版本的参考手册 https://dev.mysql.com/doc/refman/5.5/ ...

  7. 【Redis】1、Jedis对管道、事务以及Watch的操作来应对高并发

    对于一个互联网平台来说,高并发是经常会遇到的场景.最有代表性的比如秒杀和抢购.高并发会出现三个特点: 1.高并发读取 2.高并发写入(一致性) 3.出现超卖问题 前端如何应对? 1.缓存静态数据,例如 ...

  8. Jedis使用管道优化批量输出插入的效率

    Jedis连接池: package com.daxin.jedis_datastructure; /** * * @author daxin * * @email leodaxin@163com * ...

  9. jedis使用管道(pipeline)对redis进行读写(使用hmset、hgetall测试)

    一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client.这有点类似于HBase的Scan, ...

随机推荐

  1. hadoop中的一次集群任务执行超时问题查找过程

    问题背景 本次进行一个项目的重构,在某些活动数据量比较大的情况下,会偶尔出现1200s超时的情况,如下: AttemptID:attempt_1410771599055_11709_m_000033_ ...

  2. 我为什么一直不愿意用bootstrap

    做前端有2年多的时间了,知道bootstrap已经很久了. 第一次了解bootstrap是1年前,公司的一次培训中. 当时感到非常的愤怒,因为对框架的了解不够深入产生了这样的一个想法: 怎么会有这种框 ...

  3. jaxp使用笔记

    XML文件的解析技术有DOM和SAX方式,在Android中还有pull解析方式,这里不再讨论 DOM解析的方式和js中的DOM操作是一致的,DOM解析一次将文档加载入内存建立树型模型,但是如果XML ...

  4. JAVA中的IO流介绍(2)

    一.流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端, ...

  5. Android——日期格式化转换符

    常见日期格式化转换符 转换符 说 明 示 例 %te  一个月中的某一天(1-31)  2 %tb  指定语言环境的月份简称  Feb(英文).二月(中文) %tB  指定语言环境的月份全称  Feb ...

  6. MacOS下JDK6源码配置

    参考:http://www.mkyong.com/mac/how-to-download-jdk-source-code-for-mac-os-x/ 系统默认的JDK是没有源码的,据说这是因为此JDK ...

  7. memcached内存分配机制

    memcached的内存分配没有用到c语言中自带的malloc函数,因为这个函数分配内存的时候效率很低,对于这种要求快速响应,对效率要求非常高的缓存软件来说非常不合适. memcached用的是自己的 ...

  8. ARM汇编中值滤波实验

    其实就是 汇编的排序然后选出中位数 排序写的是最直接的冒泡排序,因为简单. 相应的C代码 r2=r0; while(r1<r0){ r1++; r2=r2-; r3=; while(r3< ...

  9. Eclipse注释配置

    新的文件/** * @ClassName: ${type_name}  * @Description: ${todo} * @author ${user} * @date ${date} ${time ...

  10. SpringMVC 配置多个dispatcher 及WebApplicationInitializer的使用

    SpringMVC 在配置多个dispatcher时,一般可以如下配置: <!-- spring mvc start --> <servlet> <servlet-nam ...