目录

  • Redis 管道技术
  • SpringDataRedis 使用管道
  • Redis 管道的性能测试
  • 使用管道技术的注意事项
  • 代码示例

Redis 管道技术

Redis是一种基于客户端-服务端模型(C/S模型)以及请求/响应协议的TCP服务。

这意味着通常情况下一个请求会遵循以下步骤:

  • 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。

  • 服务端处理命令,并将结果返回给客户端。

这就是普通请求模型。

所谓RTT(Round-Trip Time),就是往返时延,在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。

一般认为,单向时延 = 传输时延t1 + 传播时延t2 + 排队时延t3

为了解决这个问题,Redis支持通过管道,来达到减少RTT的目的。

SpringDataRedis 使用管道

SpringDataRedis提供了executePipelined方法对管道进行支持。

下面是一个Redis队列的操作,放到了管道中进行操作。

package net.ijiangtao.tech.framework.spring.ispringboot.redis.pipelining;import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;import java.time.Duration;
import java.time.Instant;/*** Redis Pipelining** @author ijiangtao* @create 2019-04-13 22:32**/
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class RedisPipeliningTests {@Autowiredprivate RedisTemplate<String, String> redisTemplate;private static final String RLIST = "test_redis_list";@Testpublic void test() {Instant beginTime2 = Instant.now();redisTemplate.executePipelined(new RedisCallback<Object>() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {for (int i = 0; i < (10 * 10000); i++) {connection.lPush(RLIST.getBytes(), (i + "").getBytes());}for (int i = 0; i < (10 * 10000); i++) {connection.rPop(RLIST.getBytes());}return null;}});log.info(" ***************** pipeling time duration : {}", Duration.between(beginTime2, Instant.now()).getSeconds());}
}

注意executePipelined中的doInRedis方法返回总为null

Redis 管道的性能测试

上面简单演示了管道的使用方式,那么管道的性能究竟如何呢?

下面我们一起来验证一下。

首先,redis提供了redis-benchmark工具测试性能,我在自己的电脑上通过cmd打开命令行,不使用管道,进行了一百万次set和get操作,效果如下:

$ redis-benchmark -n 1000000 -t set,get -q
SET: 42971.94 requests per second
GET: 46737.71 requests per second

平均每秒处理4万多次操作请求。

通过-P命令使用管道,效果如下:

$ redis-benchmark -n 1000000 -t set,get -P 16 –q
SET: 198098.27 requests per second
GET: 351988.72 requests per second

使用管道以后,set和get的速度变成了每秒将近20万次和35万次。

然后我在服务器上,测试了使用SpringDataRedis进行rpop出队2000次的性能。

分别使用单线程出队、32个线程并发出队和单线程管道出队。下面是测试的结果:

从统计结果来看,出队2000次,在单线程下大约需要6秒;32个线程并发请求大约需要2秒;而单线程下使用管道只需要70毫秒左右。

使用管道技术的注意事项

当你要进行频繁的Redis请求的时候,为了达到最佳性能,降低RTT,你应该使用管道技术。

但如果通过管道发送了太多请求,也会造成Redis的CPU使用率过高。

下面是通过循环向Redis发送出队指令来监听队列的CUP使用情况:

当管道中累计了大量请求以后,CUP使用率迅速升到了100%,这是非常危险的操作。

对于监听队列的场景,一个简单的做法是当发现队列返回的内容为空的时候,就让线程休眠几秒钟,等队列中累积了一定量数据以后再通过管道去取,这样就既能享受管道带来的高性能,又避免了CPU使用率过高的风险。

Thread.currentThread().sleep(10 * 1000);

代码示例

Github-ispringboot-redis

Redis管道技术的使用相关推荐

  1. Redis 管道技术

    Redis 管道技术 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以 ...

  2. php redis 管道技术,Redis管道技术这么厉害,你都用对了吗

    Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响 ...

  3. 雷林鹏分享:Redis 管道技术

    Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响 ...

  4. Redis 管道技术——Pipeline

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

  5. 速度不够,管道来凑——Redis管道技术

    Redis客户端与服务器之间使用TCP协议进行通信,并且很早就支持管道(pipelining)技术了.在某些高并发的场景下,网络开销成了Redis速度的瓶颈,所以需要使用管道技术来实现突破. 在介绍管 ...

  6. php redis pipeline管道技术

    概念 如果需要一次执行多个redis命令,以往的方式需要发送多次命令请求,有redis服务器依次执行,并返回结果,为了解决此类问题,设计者设计出了redis管道命令:客户端可以向服务器发送多个请求,而 ...

  7. 一个命名管道可以被多个客户端访问吗_Redis 的事务机制和管道技术Pipelining

    事务的四大特性:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability) 事务的属性:传播行为.隔离级别.只读和事务超时 个人见解: ...

  8. Redis管道(Pipeline)详解

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

  9. Redis管道Pipelining原理详解

    请求/响应协议和RTT Redis是一种基于客户端-服务端模型及请求/响应协议的TCP服务. 这意味着一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常以阻塞模式, ...

最新文章

  1. python读取yuv
  2. 体验共享——技术实现瓶颈与突破
  3. XCTF-高手进阶区:lottery
  4. 华清实训的收获(人工智能的小广告和福利)
  5. spss方差分析_【案例】SPSS统计分析:多因素方差分析
  6. Oracle案例:深入解析ASM rebalance无法启动
  7. 智能感知与万物互联学术讲座
  8. mysql解压版有配置文件么_3分钟安装MySQL5.7解压版
  9. for myself
  10. 大数据可视化要避免的常见错误
  11. golang 猜数字小游戏
  12. roseha修改服务器ip地址,roseha 9.0 for windows维护手册_v2.0-2015-04.pdf
  13. 金山软件遭遇“35岁危机”,曾经风光无限,如今谁能养老?
  14. 彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑
  15. 9个新零售用户画像中常用的用户模型
  16. 管理服务之间的依赖关系
  17. 移动硬盘无法访问设备未就绪资料找到的法子
  18. 怎么画一点透视,两点透视,三点透视
  19. android 同根动画_[转载]Android anim动画切换效果
  20. PC历史上的20位英雄

热门文章

  1. vc60.pdb打不开怎么办
  2. 自动秘钥密码(Autokey)
  3. 怎么把文字转换成语音,这里有简单的方法
  4. Allegro从ORCAD原理图生成网表后,导入Allegro PCB教程
  5. python-老王开枪
  6. 蒙特卡洛(Monte Carlo)方法的介绍和应用
  7. android 图形平移 镜子效果 倒影效果
  8. Linux下ll命令
  9. matlab中 rgb2gray() 函数 具体实现
  10. 无论创业还是做人,你都需要知道什么是MVPPMF