Redis中Pipeline的使用
写在前面: 我们通常是通过使用RedisTemplate每次执行一个命令,这在命令不多的情况下是可以接收的,当我们需要执行大量的命令时,如果一条一条的执行,就会因为通信次数的增加而产生延迟。因此,Redis也引入了pipeline的机制来提升性能,我们可以通过pipeline将所有需要执行的命令,一次性的提交给Redis的服务端,然后挨个执行,这样就会大大的减少通信次数,从而提升性能。当然了,需要注意的是:输入的所有命令中:一个命令的执行结果不影响另一个命令的输入
1、两种调用方式
在Spring环境下,使用Redis的Pipeline也是很简单的:只需要调用redisTemplate的executePipelined方法就可以了,但是在参数中提供了两种回调方式:SessionCallback、RedisCallback,两种使用方式如下:
RedisCallback:
List list = redisTemplate.executePipelined(new RedisCallback<String>() {@Overridepublic String doInRedis(RedisConnection con) throws DataAccessException {con.set("key".getBytes(StandardCharsets.UTF_8), "value".getBytes(StandardCharsets.UTF_8));con.set("key2".getBytes(StandardCharsets.UTF_8), "value2".getBytes(StandardCharsets.UTF_8));con.set("num".getBytes(StandardCharsets.UTF_8), "0".getBytes(StandardCharsets.UTF_8));con.incr("num".getBytes(StandardCharsets.UTF_8));return null; // 切记此处要返回null,否则会抛出InvalidDataAccessApiUsageException异常}});System.out.println(Arrays.toString(list.toArray())); // [true, true, true, 1]
SessionCallback:
List list = redisTemplate.executePipelined(new SessionCallback<String>() {@Overridepublic String execute(RedisOperations operations) throws DataAccessException {operations.opsForZSet().intersectAndStore(firstKey, secondKey, destKey);redisTemplate.opsForZSet().reverseRange(destKey, 0, 10);return null; // 切记此处要返回null,否则会抛出InvalidDataAccessApiUsageException异常}});
区别:
SessionCallback封装的更好一点,对程序员直接调用比较友好;RedisCallback相对而言更加的底层一点,对程序员不是很友好;开发中是推荐使用前者的,即SessionCallback。
2、注意点
需要切记的是回调中的返回值必须是null才可以,否则会抛出InvalidDataAccessApiUsageException异常,相关源码如下:
说到这里,那就有人问了,我需要获取命令返回的值怎么办呢?不得不说这是一个好问题,大家注意下,这个回调的返回值是一个List集合,我们在回调里操作的命令的返回值都依次的被收集到了这个集合中反悔了,我们需要哪个命令的返回值,直接在List中拿就可以了,比如例子二中我们需要获取第二条命令返回的Set集合,我们只需要 **(Set)list.get(1)**即可
Redis中Pipeline的使用相关推荐
- redis中的multi和pipeline
事务块 multi redis中的 multi 方法,提供了一个队列用于缓存多个指令,在客户端调用 exec 后将该队列中的指令批量执行,执行过程中不会被其他指令干扰(具有原子性). 客户端每发送一个 ...
- .NET客户端实现Redis中的管道(PipeLine)与事物(Transactions)(八)
序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次性响应多个命令. Redis使用的是客户端-服务器模型和请求/响应协议的T ...
- redis中的事务、lua脚本和管道的使用场景
https://blog.csdn.net/fangjian1204/article/details/50585080 事务 redis中的事务并不像mysql中那么完美,只是简单的保证了原子性.re ...
- Redis中的代理Sharding
典型的代理分区方案有Twitter 开源的Twemproxy 和国内的豌豆荚开源的Codis. Twemproxy two-em-proxy https://github.com/twitter/tw ...
- redis 中一个字段 修改map_CTO 指名点姓让我带头冲锋,熬了一个通宵,终于把Redis中7千万个Key删完了...
由于有一条业务线不理想,高层决定下架业务.对于我们技术团队而言,其对应的所有服务器资源和其他相关资源都要释放. 释放了 8 台应用服务器:1 台 ES 服务器:删除分布式定时任务中心相关的业务任务:备 ...
- mysql 事务回滚_简短截说阐述redis中事务的使用
我们知道,在关系型数据库中,比如mysql,如果要使用事务,首先向数据库服务器发送 BEGIN ,然后执行各个相互一致的写操作和读操作,最后,用户可以选择发送 COMMIT 来确认之前所做的修改,或者 ...
- php怎么用redisson,Redis中RedisTemplate和Redisson管道的使用
当对Redis进行高频次的命令发送时,由于网络IO的原因,会耗去大量的时间.所以Redis提供了管道技术,就是将命令一次性批量的发送给Redis,从而减少IO. 一.Jedis对redis的管道进行操 ...
- [转载] python怎么获取redis中的数据_python操作redis数据库
参考链接: 使用Python在Selenium中进行非阻塞等待 3.redis基本命令 String set(name, value, ex=None, px=None, nx=False, xx=F ...
- Redis 学习 - 05 Node.js 客户端操作 Redis、Pipeline 流水线
使用编程语言客户端操作 Redis 目前我们进行的操作都是通过 Redis 的命令行客户端 redis-cli 进行的. 开发者也可以通过 Redis 图形管理软件操作,例如 RDM(Redis De ...
- Redis中事务用法详解
在关系型数据库中,事务是指一组命令的集合,这组命令构成了一个原子操作,这个操作要么全部执行成功,要么全部执行失败.而在非关系型数据库 Redis 中并非这样- Redis 中的事务同样也是一组命令的集 ...
最新文章
- Linux利用子命令m,Linux mdir命令
- 悬浮球多功能_一个悬浮球,怎么可以这么贴心~
- vector 修改 java_java对vector动态数组中的对象排序,以下代码有何问题,如何修改?...
- devops_您的DevOps阅读心愿单的10本书
- Kaggle入门预测赛,手写数字识别Digit Recognizer,使用Kaggle kernel作答,F=0.98
- Windows server 2008 R2桌面调出“计算机”等图标
- 听一下牛人是怎样自学MIT计算机系全部课程的[转]
- 关于在window下使用docker的备选方案
- 武田2020财年第三季度业绩彰显增长加速和持续的韧性;确认了2020财年全年管理层指引,并上调了自由现金流以及列报每股盈利的预测
- 基于微信小程序的网上购物系统的设计与实现.pdf
- 算法学习-求平方根函数
- android 调用webservice实现手机号码归属地查询
- 作业提交试题下载网站
- Python游戏编程入门(有目录及案例图片)-通过简单游戏学习python
- Exploiting Shared Representations for Personalized Federated Learning【2021 icml】
- 42-面对对象编程(高级部分)1
- python 12306登录 2019_python实现12306登录并保存cookie的方法示例
- 优秀Java书单整理
- 基于matlab了光纤模式图,基于matlab光纤的模式图模拟
- Taurus MVC框架
热门文章
- VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对CAD/VRML进行二次开发的简介、案例应用之详细攻略
- arcgis10之将多个shp文件合并成一个shp文件
- 第六篇 | 解决linux环境中mysql默认端口3306无法连接问题
- oracle mysql认证考试流程_oraclemysql认证的考试流程有些什么
- easyui框架搭建
- VPX单板计算机xPower 6110
- 数据结构中数据元素与数据项的区别
- LaTex(2021)安装教程
- Python 竟也可以写网页前端了
- 推荐一款好用的telnet工具