[转帖]Redis Pipeline使用

redis,pipeline,使用 · 浏览次数 : 0

小编点评

**使用 Pipeline 的原因:** 1. **减少 IO开销:** Pipeline 通过将多个命令分组并发送给 Redis 服务端,减少了每条命令单独传输的 IO 开销。 2. **减少系统调用次数:** Pipeline 使用管道,可以合并多个命令为一个,减少了系统调用次数。 3. **提升吞吐能力:** Pipeline 可以并行执行多个命令,提高了整体的吞吐能力。 4. **模拟原生批量命令:** Pipeline 可以模拟原生批量命令的功能,但它与原生批量命令有以下主要区别: - 原生批量命令是原子的,而 Pipeline 是非原子的。 - 原生批量命令是一个命令对应多个 key,而 Pipeline 支持多个命令。 - 原生批量命令是 Redis 服务端支持实现的,而 Pipeline 需要服务端和客户端的共同配合。 5. **优化性能:** Pipeline 可以根据系统负载自动调整执行顺序,以确保性能最佳化。

正文

https://www.cnblogs.com/-wenli/p/12922089.html

 

为什么使用 Pipeline?

Redis客户端执行一条命令分为如下四个过程:

  1. 发送命令
  2. 命令排队
  3. 命令执行
  4. 返回结果

其中,1到4称为Round Trip Time(RTT,往返时间)。

Redis提供了批量操作命令(例如mset、mget等),有效地节省了RTT。但大部分命令是不支持批量操作的,例如要执行n次hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT。Redis的客户端和服务端可能部署在不同的机器上。例如客户端在北京,Redis服务器在上海,两地直线距离1300公里,那么一次RTT时间= 1300 x2 / 3000000 x
2/3) = 13毫秒(光在真空中的传输速度为30万公里/秒,这里假设光纤为光速的2/3),那么客户端在1秒内大约只能执行80次左右的命令,这个Redis的高并发高吞吐特性背道而驰。

总结:Redis的pipeline功能的原理是 客户端通过一次性将多条redis命令发往Redis 服务端,减少了每条命令分别传输的IO开销。同时减少了系统调用的次数,因此提升了整体的吞吐能力。

未使用pipeline执行N条命令

在这里插入图片描述

使用了pipeline执行N条命令

在这里插入图片描述

 

go语言下Pipeline使用

 

  • 获取Redis对象(一般从连接池中获取)
  • 获取Redis对象的pipeline对象
  • 添加指令
  • 执行指令 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main
 
import (
    "github.com/go-redis/redis"
    "log"
    "strconv"
)
 
func main() {
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: ""// no password set
        DB:       0,  // use default DB
        Network:  "tcp",
        PoolSize: 50,
    })
    if _, err := client.Ping().Result(); err != nil {
        panic(err)
    }
    pipe := client.Pipeline()
        pipe.Get("key1")
       pipe.Get("key2")
       pipe.Get("key3")
        result, err := pipe.Exec()
        defer client.Close()
} 

redis-go:

github:https://github.com/alphazero/Go-Redis

 

 

原生批量命令(mset, mget)与Pipeline对比

可以使用Pipeline模拟出批量操作的效果,但是在使用时要注意它与原生批量命令的区别,主要包括如下几点:

  • 原生批量命令是原子的,Pipeline是非原子的;
  • 原生批量命令是一个命令对应多个key,Pipeline支持多个命令;
  • 原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同配合。

 

参考:

https://blog.csdn.net/w1lgy/article/details/84455579?utm_medium=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

与[转帖]Redis Pipeline使用相似的内容:

[转帖]Redis Pipeline使用

https://www.cnblogs.com/-wenli/p/12922089.html 为什么使用 Pipeline? Redis客户端执行一条命令分为如下四个过程: 发送命令 命令排队 命令执行 返回结果 其中,1到4称为Round Trip Time(RTT,往返时间)。 Redis提供了

[转帖]Redis进阶(发布订阅,PipeLine,持久化,内存淘汰)

目录 1、发布订阅 1.1 什么是发布订阅 1.2 客户端实例演示 1.3 Java API演示 1.4 Redis发布订阅和rabbitmq的区别 2、批量操作 2.1 普通模式与 PipeLine 模式 2.2 适用场景 2.3 源码解析 2.4 Pipelining的局限性 2.5 事务与 L

[转帖]Redis学习三(进阶功能).

https://www.cnblogs.com/jmcui/p/11707970.html 阅读目录 一、排序 二、事务 三、流水线(pipeline) 四、发布订阅 回到顶部 一、排序 redis 支持对 list,set 和 zset 元素的排序,排序的时间复杂度是 O(N+M*log(M))。

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

[转帖]Redis 7.0 三节点哨兵(Sentinel)高可用 环境搭建手册

2022-06-17 16:253480原创Redis 本文链接:https://www.cndba.cn/dave/article/108088 1 哨兵高可用架构说明 Redis 最早的高可用方案是主从复制,但这种方案存在一个问题,就是当主库宕机后,从库不会自动切成主库,需要人工干预。 所有在主

[转帖]Redis 备份与恢复(RDB/AOF) 说明

2022-06-16 20:364580原创Redis 本文链接:https://www.cndba.cn/dave/article/108068 1 RDB 方式 1.1 RDB 备份恢复说明 Redis 的备份恢复有两种方法:RDB和AOF。 其中RDB 文件是一个经过压缩的二进制文件,有两个R

[转帖]Redis 性能优化的 13 条军规!史上最全

https://zhuanlan.zhihu.com/p/118532234 Redis性能优化实战方案 Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O

[转帖]Redis性能调优万字总结,面试必问!

https://zhuanlan.zhihu.com/p/541745804 于哥你好,最近面试挺多的,尤其是在问到java面试题,Redis被问的特别多,比如 Redis的内存模型? Redis的底层数据结构是怎么的? Redis的多线程模型 Redis的集群原理 Redis的雪崩,击穿,穿透怎么

[转帖]Redis连接未释放,造成TCP连接数过多

https://segmentfault.com/a/1190000022704886 早上看到服务器告警通知,TCP连接数比较高,达到5000多,我设置的阈值是5000,正常TCP连接不会这么高,这样的一个阈值我可以提前知道有问题早点解决,不至于后面引起一系列问题,甚至拖垮服务器。 排查 登陆服务

[转帖]Redis客户端Jedis、Lettuce、Redisson

https://www.jianshu.com/p/90a9e2eccd73 在SpringBoot2.x之后,原来使用的jedis被替换为了lettuce Jedis:采用的直连,BIO网络模型 Jedis有一个问题:多个线程使用一个连接的时候线程不安全。 解决思路是: 使用连接池,为每个请求创建