【转载】Jedis对管道、事务以及Watch的操作详细解析
转载地址:http://blog.csdn.net/liyantianmin/article/details/51613772
1、Pipeline
利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而Redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。所以pipeline适合批处理作业可以提升效率如:
- public static void testMget() {
- Jedis jedis = RedisCacheClient.getInstrance().getClient();
- Set<String> keys = jedis.keys("cvfeedBackHandl_*");
- List<String> result = Lists.newArrayList();
- long t1 = System.currentTimeMillis();
- for (String key : keys) {
- result.add(jedis.get(key));
- }
- for (String src : result) {
- System.out.println(src);
- }
- System.out.println(System.currentTimeMillis() - t1);
- }
- public static void testPipline() {
- Jedis jedis = RedisCacheClient.getInstrance().getClient();
- Set<String> keys = jedis.keys("cvfeedBackHandl_*");
- List<Object> result = Lists.newArrayList();
- Pipeline pipelined = jedis.pipelined();
- long t1 = System.currentTimeMillis();
- for (String key : keys) {
- pipelined.<span style="font-family: Arial;">get</span>("testabcd");
- }
- result = pipelined.syncAndReturnAll();
- for (Object src : result) {
- System.out.println(src);
- }
- System.out.println(System.currentTimeMillis() - t1);
- }
如第一个方法执行的时间是82ms
第二个方法执行的时间是9ms
注意:pipeline和事务都是异步调用返回结果的,即并不是等待每条命令执行完立马返回结果而是等待所有命令执行完之后再返回结果。pipelined.syncAndReturnAll()返回的是参与打包执行的每条命令的结果。如果上面改成:
- for (String key : keys) {//keys长度为5
- pipelined.get(key);
- pipelined.del("testabcd");
- }
返回结果将是
- "test1"
- 1
- "test2"
- 0
- "test2"
- 0
- "test4"
- 0
- "test5"
- 0
2、事务
事务是保证事务内的所有命令是原子操作,一般配合watch使用,事务的执行结果和pipeline一样都是采用异步的方式获取结果,multi.exec()提交事务,如果执行成功,其返回的结果和pipeline一样是所有命令的返回值,如果事务里面有两个命令那么事务的exec返回值会把两个命令的返回值组合在一起返回。如果事务被取消返回null。
3、watch
一般是和事务一起使用,当对某个key进行watch后如果其他的客户端对这个key进行了更改,那么本次事务会被取消,事务的exec会返回null。jedis.watch(key)都会返回OK
eg:
- public static void testWach(){
- Jedis jedis = RedisCacheClient.getInstrance().getClient();
- String watch = jedis.watch("testabcd");
- System.out.println(Thread.currentThread().getName()+"--"+watch);
- Transaction multi = jedis.multi();
- multi.set("testabcd", "23432");
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- List<Object> exec = multi.exec();
- System.out.println("---"+exec);
- jedis.unwatch();
- }
- public static void testWatch2(){
- Jedis jedis = RedisCacheClient.getInstrance().getClient();
- String watch = jedis.watch("testabcd2");
- System.out.println(Thread.currentThread().getName()+"--"+watch);
- Transaction multi = jedis.multi();
- multi.set("testabcd", "125");
- List<Object> exec = multi.exec();
- System.out.println("--->>"+exec);
- }
Thread-2--OK
Thread-0--OK
--->>[OK]
---null//事务取消
4、事务与管道
当对某个key进行watch时,如果其他的客户端对key进行了更改事务可以做到取消事务操作但是管道不可以
【转载】Jedis对管道、事务以及Watch的操作详细解析的更多相关文章
- 征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)
有日子没写博客了,真的是忙得要疯掉. 完成项目基础架构搭建工作,解决了核心技术问题,接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: 征服 Redis 征服 Redis + J ...
- 【转载】微软官方提供的Sqlserver数据库操作帮助类SQLHelper类
在.NET平台中,C#语言一般使用ADO.NET组件来操作Sqlserver数据库,通过ADO.NET组件可以实现连接数据库.查询数据集.执行SQL语句以及关闭数据库连接等操作,为此网上有很多开发者自 ...
- spring-data-redis的事务操作深度解析--原来客户端库还可以攒够了事务命令再发?
一.官方文档 简单介绍下redis的几个事务命令: redis事务四大指令: MULTI.EXEC.DISCARD.WATCH. 这四个指令构成了redis事务处理的基础. 1.MULTI用来组装一个 ...
- MySQL线上执行大事务或锁表操作
前提 在线执行一些大事务或锁表操作(给某个核心级表加一列或者执行修改操作),此时不但主库从库要长时间锁表,主从延迟也会变大.未避免大事务sql对整个集群产生影响,,我们希望一条SQL语句只在Maste ...
- 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 ...
- MySQL 事务配置命令行操作和持久化
MySQL 事务配置命令行操作和持久化 参考 MySQL 官方参考手册 提供 5.5 5.6 5.7 8.0 版本的参考手册 https://dev.mysql.com/doc/refman/5.5/ ...
- 【Redis】1、Jedis对管道、事务以及Watch的操作来应对高并发
对于一个互联网平台来说,高并发是经常会遇到的场景.最有代表性的比如秒杀和抢购.高并发会出现三个特点: 1.高并发读取 2.高并发写入(一致性) 3.出现超卖问题 前端如何应对? 1.缓存静态数据,例如 ...
- Jedis使用管道优化批量输出插入的效率
Jedis连接池: package com.daxin.jedis_datastructure; /** * * @author daxin * * @email leodaxin@163com * ...
- jedis使用管道(pipeline)对redis进行读写(使用hmset、hgetall测试)
一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client.这有点类似于HBase的Scan, ...
随机推荐
- iframe高度从内向外撑起
index.html: <div style="height: 200px;"></div> <iframe id="gys" s ...
- canvas之抒写文字
<canvas id="canvas" width="500" height="400" style="background ...
- Java复习——网络编程
Java从最开始就是支持网络编程的,也正是网络使Java得到发展繁荣.在这里我记录一下如何使用Java进行网络编程,什么是Socket以及Java实现TCP,UDP的编程模型. InetAddress ...
- git 本地与远程分支冲突 解决
git pull origin master git rebase origin/master git merge origin/master git rebase --continue git pu ...
- windows administrator提升system
最近刚好有这个需求,本想开一个super cmd,但是win10上不兼容不太好. 于是使用PsExec来提升system权限. 微软传送地址:https://docs.microsoft.com/en ...
- 基于七牛Python SDK写的一个批量下载脚本
前言 上一篇基于七牛Python SDK写的一个同步脚本所写的脚本只支持上传,不支持文件下载. 虽然这个需求不太强烈,但有可能有人(在备份.迁移时)需要,而官方有没提供对应的工具,所以我就把这个功能也 ...
- BDE View not exists
Table does not exist. [Microsoft][ODBC SQL Server Driver][SQL Server]对象名 'vw1' 无效.
- oracle 的分页与 mySQL'的分页转化
oracle 分页: 关键字ROWNUM SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM ( SELECT A.*, ...
- Linux内核SPI支持概述
1. 什么是SPI? Serial Peripheral Interface是一种同步4线串口链路,用于连接传感器.内存和外设到微控制器.他是一种简单的事实标准,还不足以复杂到需要一份正式的规范.SP ...
- kubernetes configmap
ConfigMaps允许您将配置工件与image内容分离,以保持容器化应用程序的便携性. 本页面提供了一系列使用示例,演示如何使用ConfigMaps中存储的数据创建ConfigMaps和配置Pod. ...