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命令时,应该优先考虑使用管道。

相关推荐
夜晚打字声19 小时前
9(九)Jmeter如何连接数据库
数据库·jmeter·oracle
Chasing__Dreams19 小时前
Mysql--基础知识点--95--为什么避免使用长事务
数据库·mysql
风吹迎面入袖凉19 小时前
【Redis】Redis的五种核心数据类型详解
java·redis
NineData19 小时前
NineData 智能数据管理平台新功能发布|2026 年 3 月
数据库·oracle·架构·dba·ninedata·数据复制·数据迁移工具
小陈工19 小时前
2026年4月7日技术资讯洞察:下一代数据库融合、AI基础设施竞赛与异步编程实战
开发语言·前端·数据库·人工智能·python
❀͜͡傀儡师19 小时前
k8s部署的Nexus 3 数据库损坏恢复指南:从删除损坏数据库到完整数据重建
数据库·kubernetes·nexus3
StackNoOverflow20 小时前
Spring Security权限控制框架详解
java·数据库·sql
不愿透露姓名的大鹏20 小时前
Oracle归档日志爆满急救指南
linux·数据库·oracle·dba
a里啊里啊21 小时前
Redis面试题记录
数据库·redis·缓存
数据知道21 小时前
claw-code 源码分析:OmX `$team` / `$ralph`——把 AI 辅助开发从偶发灵感变成可重复流水线
数据库·人工智能·mysql·ai·claude code·claw code