文章目录

  • 概述
  • JavaAPI 操作Redis Pipeline
  • Spring操作Redis Pipeline
  • 代码

概述

Redis 的事务的各类问题,在事务中 Redis 提供了队列, 这是一个可以批量执行任务的队列,这样性能就比较高,但是使用 multi…exec 事务命令是有系统开销的,因为它会检测对应的锁和序列化命令。

有时候我们希望在没有任何附加条件的场景下去使用队列批量执行一系列的命令,从而提高系统性能,这就是 Redis 的流水线( pipelined )技术。

而现实中 Redis 执行读/写速度十分快,而系统的瓶颈往往是在网络通信中的延时,如下

为了解决这个问题,可以使用 Redis 的流水线 , 但是 Redis 的流水线是一种通信协议没有办法通过客户端演,不过我们可以通过 JavaAPI 或者使用 Spring 操作它.


前置条件: reids中的各种属性JavaAPI或者是Spring操作的时候保持一致,一边观察性能。

JavaAPI 操作Redis Pipeline

package com.artisan.redis.pipelined;import java.util.List;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Pipeline;public class PipelineWithJavaDemo {public static void main(String[] args) {// 实例化jedisPoolConfig并设置相关参数JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxIdle(6);jedisPoolConfig.setMaxTotal(20);jedisPoolConfig.setMaxWaitMillis(3000);jedisPoolConfig.setMinEvictableIdleTimeMillis(300000);jedisPoolConfig.setTimeBetweenEvictionRunsMillis(30000);// 使用jedisPoolConfig初始化redis的连接池JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.31.66", 6379);// 从jedisPool中获取一个连接Jedis jedis = jedisPool.getResource();jedis.auth("artisan");long beginTime = System.currentTimeMillis();// 开启流水线Pipeline pipeline = jedis.pipelined();// 测试10 万条的读/写 2 个操作for (int i = 0; i < 100000; i++) {int j = i + 1 ;jedis.set("pipeline_key" + j , "pipeline_value" + j);jedis.get("pipeline_key" + j);}// 这里只执行同步,但是不返回结果// pipeline.sync();// 将返回执行过的命令返回的 List 列表结果List list = pipeline.syncAndReturnAll();long endTime = System.currentTimeMillis();System.out.println("10 万条的读/写 2 个操作 ,耗时:" + (endTime - beginTime) + "毫秒");}}

输出

10 万条的读/写 2 个操作 ,耗时:87030毫秒

Spring操作Redis Pipeline

在 Spring 中使用 RedisTemplate提供的 executePipelined 方法即可行流水线

package com.artisan.redis.pipelined;import java.util.List;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;public class PipelineWithSpringDemo {@SuppressWarnings({ "rawtypes", "unchecked", "unused", "resource" })public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/spring-redis-string.xml");RedisTemplate redisTemplate = ctx.getBean(RedisTemplate.class);SessionCallback sessionCallback = (SessionCallback) (RedisOperations ops) -> {for (int i = 0; i < 100000; i++) {int j = i + 1 ;ops.boundValueOps("pipeline_key" + j).set("pipeline_value" + j);ops.boundValueOps("pipeline_key" + j).get();}return null;};long beginTime = System.currentTimeMillis();// 执行 Redis 的流水线命令List list = redisTemplate.executePipelined(sessionCallback);long endTime = System.currentTimeMillis();System.out.println("10 万条的读/写 2 个操作 ,耗时:" + (endTime - beginTime));}}
INFO : org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@73a8dfcc: startup date [Thu Sep 27 19:55:06 CST 2018]; root of context hierarchy
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [spring/spring-redis-string.xml]
10 万条的读/写 2 个操作 ,耗时:2161

这里只是为了测试性能而己,当你要执行很多的命令并返回结果的时候 , 需要考虑 List 对象的大小,因为它会“吃掉”服务器上许多的内存空间 , 严重时会导致内存不足,引发 JVM 溢出异常.


代码

代码托管到了 https://github.com/yangshangwei/redis_learn

Redis-12Redis 流水线( pipeline )相关推荐

  1. java redis 流水线_Redis附加功能之Redis流水线pipeline

    流水线功能的目的:通过减少客户端与服务器之间的通信次数来提高程序的执行效率. 一.通信 在一般情况下, 用户每执行一个 Redis 命令,客户端与服务器都需要进行一次通信:客户端会将命令请求发送给服务 ...

  2. jenkins pipeline脚本_Jenkins 创建流水线 (Pipeline) 项目的脚本

    前一段时间在做接口测试自动化方面的工作.现在整理下,接口测试国中学到的知识,做到边学边用到实践了.下面,介绍下,把接口测试项目集成到Jenkins,建立PIpeline项目. Pipeline 是一套 ...

  3. Redis的管道pipeline

    本文来说下Redis的管道pipeline 文章目录 概述 Redis管道技术 SpringDataRedis使用管道 使用管道技术的注意事项 本文小结 概述 Redis提供了一个称为管道(Pipel ...

  4. jenkins pipeline_Jenkins流水线(pipeline)实战之:从部署到体验

    关于Jenkins流水线(pipeline) Jenkins 流水线 (pipeline) 是一套插件,让Jenkins可以实现持续交付管道的落地和实施. 关于blueocean Blue Ocean ...

  5. Redis事务与Pipeline功能

    一.Redis事务 Redis中的事务(transaction)是一组命令的集合,对事物的支持有限,不能保证原子性,在集群分片环境中,由于不同key可能存在不同的机器上,所以造成事务无法使用(可以简单 ...

  6. redis cluster使用pipeline

    redis cluster使用pipeline 为什么cluster无法使用pipeline 基于redisCluster整合pipeline 设计思路 代码实现 为什么cluster无法使用pipe ...

  7. [项目管理-20]:流水线pipeline与项目管理

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址: 目录 第1章 什么是流水线pipeline技术 1.1 工业流水线的思路 1.2 CPU执行指令 ...

  8. Redis 管道技术——Pipeline

    管道技术(Pipeline)是客户端提供的一种批处理技术,用于一次处理多个 Redis 命令,从而提高整个交互的性能. 通常情况下 Redis 是单行执行的,客户端先向服务器发送请求,服务端接收并处理 ...

  9. Redis管道(Pipeline)详解

    在讲解管道前,我们首先来了解一下redis的交互,redis的一次交互是由客户端发起,由服务端接收,那么我们连续操作一些指令,如下图所示: 客户端请求一个指令到服务器到服务器返回数据这个过程非常复杂, ...

  10. jenkins中的流水线( pipeline)的理解(未完)

    目录 一.理论概述 Jenkins流水线的发展历程 什么是Jenkins流水线 一.理论概述 pipeline是流水线的英文释义,文档中统一称为流水线 Jenkins流水线的发展历程 ​ 在Jenki ...

最新文章

  1. 9.可变参数创建不可变集合
  2. 一起再看执行上下文/作用域链/原型链
  3. linux中看挂载的磁盘用什么命令,使用Linux命令行挂载硬盘和分区 | MOS86
  4. 获取url后的指定参数
  5. 【Python】列表 list 添加元素的几种方法
  6. 数据库原理与应用(SQL Server)笔记 第一章 数据定义语言和数据操纵语言
  7. 基于MATLAB的Sobel边缘检测算法实现
  8. java 调试js_Java与JS代码调试技巧
  9. 计算两个日期之间相差的天数(带带负数) 支持格式YYYY-mm-dd和YYYY-mm-dd HH:mm:ss...
  10. tensorflow2.0 图像处理项目_UCOSIII移植——STM32F769I 图像处理能力评测之五
  11. 详细设计 存储分配_【存储论文笔记】Windows Azure Storage
  12. C#处理Json文件
  13. winform Chart图表控件使用(绑定数据)
  14. 没有实际的工作经验,如何面试Linux运维工程师?
  15. CCA算法 matlab,典型相关分析(CCA)附算法应用及程序
  16. VS2013扩展——Advanced JavaScript outlining,让js和css也折叠
  17. CPU 流水线的前世今生
  18. 应届生面试该注意的小技巧
  19. S5PV210 iNAND/SD卡
  20. 高职计算机教CAD,高职城乡规划专业“Auto CAD计算机辅助设计课程改革设计

热门文章

  1. php 新闻列表,php原生开发新闻站之新闻列表(二)
  2. Leetcode 剑指 Offer 53 - I. 在排序数组中查找数字 I (每日一题 20210928)
  3. python 笔记:nltk (标记英文单词词性等)
  4. 文巾解题 178. 分数排名
  5. R语言应用实战系列(四)-Apriori算法的相关内容(附案例源代码)
  6. tableau必知必会之通过 Tableau 计算挖掘数据真相
  7. Linux疑难杂症解决方案100篇(九)-SHELL编程正则表达式
  8. Tableau必知必会之妙用Fixed函数聚合分析维度
  9. xss绕过字符过滤_XSS过滤器绕过总结
  10. 电子产品设计流程_产品设计“学习、就业、留学”全攻略