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

相关推荐
奇特認3 小时前
mysql 集群技术 3.高可用之 MHA
数据库·mysql
Bioinfo Guy5 小时前
高分Panel复现系列|转录因子网络太乱?用模块框把重点圈出来
数据库·生物信息学·生信可视化
ltl7 小时前
Disaggregated DB 合集:Socrates、PolarDB、Taurus 的共同模式
数据库
Blossom i9 小时前
大数据预处理与采集实验一:使用Python操作MySQL数据库
数据库·mysql
雾时之林10 小时前
Linux--软件管理、源码包安装
linux·服务器·数据库
老纪的技术唠嗑局11 小时前
超级干货分享:中小企业使用 OceanBase 实践经验汇总
数据库
CLOUD ACE11 小时前
谷歌云代理|零售商Target 如何利用 Spanner Graph 提升零售发现体验并将数据库维护成本降低 50%
数据库·零售
AI大模型-小雄12 小时前
Codex写分页接口为什么越翻越慢?用Cursor Pagination解决重复与漏数据
大数据·数据库·elasticsearch·搜索引擎·chatgpt·后端开发·codex
少晓年12 小时前
从 MySQL 迁移到人大金仓 KingbaseES:完整指南与实践
数据库·mysql
东宇科技12 小时前
让网页执行cmd命令
php