Redis的Pipeline (管道)

Pipeline 是一种客户端优化技术。它允许客户端一次性发送多个命令,而不需要等待每个命令的响应,最后一次性读取所有响应。这大大减少了网络往返时间 (RTT)。

python 复制代码
import redis
import time

# 连接 Redis
r = redis.Redis(host='XX.XX.XX.XX', port=6379, password='123456', socket_timeout=2, db=0)

def without_pipeline():
    start = time.time()
    for i in range(1000):
        r.set(f'key_{i}', i)
        r.delete(f'key_{i}')
    end = time.time()
    print(f"Without Pipeline: {end - start:.4f} seconds")

def with_pipeline():
    start = time.time()
    pipe = r.pipeline()
    for i in range(1000):
        pipe.set(f'key_{i}', i)
        pipe.delete(f'key_{i}')
    # 一次性发送所有命令
    pipe.execute()
    end = time.time()
    print(f"With Pipeline:    {end - start:.4f} seconds")

if __name__ == "__main__":
    print("Running Pipeline Benchmark (1000 ops)...")
    try:
        r.ping()
        without_pipeline()
        with_pipeline()
    except redis.ConnectionError:
        print("Error: Could not connect to Redis. Please ensure Redis is running.")

这个程序是一个Redis管道(Pipeline)的性能对比演示,它展示了使用管道和不使用管道在性能上的巨大差异。

程序的功能详解:

1. 程序目的

比较在Redis中执行批量操作时,使用管道和不使用管道的性能差异。

2. 具体操作

  • 进行1000次操作(设置键值对 + 删除键值对)
  • 每次循环执行两个操作:
    1. SET key_i i - 设置键值对
    2. DELETE key_i - 删除刚刚设置的键

3. 两种模式的对比

不使用管道的情况 (without_pipeline()):
复制代码
for i in range(1000):
    r.set(f'key_{i}', i)      # 第1次网络往返
    r.delete(f'key_{i}')      # 第2次网络往返

过程:

  • 每次set()delete()都是独立请求
  • 需要2000次网络往返(1000个set + 1000个delete)
  • 每个命令都等待Redis响应后才发送下一个命令
  • 总耗时:43.99秒
使用管道的情况 (with_pipeline()):
复制代码
pipe = r.pipeline()          # 创建管道对象
for i in range(1000):
    pipe.set(f'key_{i}', i)  # 添加到管道队列
    pipe.delete(f'key_{i}')  # 添加到管道队列
pipe.execute()               # 一次性发送所有命令

过程:

  • 所有命令先缓存在本地队列中
  • 最后调用execute()一次性发送给Redis
  • 只需要1次网络往返
  • Redis批量执行所有命令,然后一次性返回所有结果
  • 总耗时:0.0645秒

4. 性能差异的原因

|---------|----------|-----------|
| 对比项 | 不使用管道 | 使用管道 |
| 网络往返次数 | 2000次 | 1次 |
| 网络延迟影响 | 每次操作都要等待 | 只等待一次 |
| 带宽利用率 | 低 | 高(命令批量发送) |
| Redis处理 | 逐个处理 | 批量处理 |

5. 实际运行结果解读

复制代码
Without Pipeline: 43.9989 seconds
With Pipeline:    0.0645 seconds
  • 性能提升:约682倍 (43.9989 ÷ 0.0645)
  • 不使用管道:主要时间花在网络延迟
  • 使用管道:主要时间花在实际数据处理

6. 适用场景

这种性能对比特别明显是因为:

  1. 网络延迟较高 :测试连接到远程Redis服务器(10.40.50.59)
  2. 操作简单:每个操作本身执行很快
  3. 批量操作:操作数量大(1000次)

7. 实际应用意义

在实际开发中,管道技术常用于:

  • 批量数据导入/导出
  • 批量更新用户状态
  • 日志批量写入
  • 计数器批量操作
  • 任何需要执行大量Redis命令的场景

这个程序完美展示了为什么在需要执行多个Redis命令时,应该优先考虑使用管道。

相关推荐
jiayou6418 小时前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
BingoGo21 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack21 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
李广坤2 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
JaguarJack3 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php