Redis Pipeline介绍 ---- 提高操作Redis数据库的执行效率。

发布于:2024-08-12 ⋅ 阅读:(140) ⋅ 点赞:(0)

一、Redis Pipeline介绍

Redis Pipeline 是一种允许客户端在单个网络请求中发送多个命令到 Redis 服务器的技术。它可以显著提高批量操作的性能,尤其是在网络延迟较高的情况下。

二、 Redis Pipeline的工作原理

在使用 Pipeline 时,客户端可以将一系列命令打包成一个请求,并一次性发送到 Redis 服务器。Redis 服务器会按顺序执行这些命令,并将结果打包返回给客户端。这样可以减少多个命令的网络往返时间(RTT),从而提高性能。

三、 Redis Pipeline的原理

1. 减少网络往返时间(RTT)

  • 每个 Redis 命令在普通情况下都需要一个请求-响应周期,多个命令就需要多次网络往返。而使用 Pipeline 可以将这些命令合并到一个请求中,从而减少网络往返时间。

2. 提高命令处理效率

  • 通过批量发送命令,Redis 服务器可以更高效地处理这些命令,而不需要等待每个命令的单独响应。

3. 减轻客户端和服务器的负载

  • 通过减少网络通信次数,可以减轻客户端和服务器的负载,提高整体系统的吞吐量。

简单的原理示意图:
普通模式下:

Pipeline模式下:

四、 示例代码

1. 普通模式

import json
import time

import basic
import parse_navis_works

# 获取全部的参数数据
all_data = parse_navis_works.get_redis_data(basic.redis_host, basic.redis_port, basic.redis_password, basic.redis_db)


def main():
    a = time.time()
    # 创建Redis连接
    r = parse_navis_works.connect_redis(basic.redis_host, basic.redis_port, basic.redis_password, basic.redis_db)
    # 在redis数据库中填写数据
    for q_key, trucks in basic.WORK_LINE.items():
        cur = 0
        for truck in trucks:
            key = f'test:{truck}'
            # 删除原来的数据
            r.delete(key)
            tasks = all_data[q_key][cur]
            for task in tasks:
                # 添加数据
                r.lpush(key, json.dumps(task))
            cur += 1
    print("车辆初始化完成,数据已经成功写入到数据库中!!!")
    b = time.time()
    print(f'耗时:{b - a}')

# 测试一下提取出最右侧的任务并删除
# key1 = 'test:A520'
# a = r.rpop(key1)
# print(a.decode('utf-8'))
if __name__ == '__main__':
    main()

车辆初始化完成,数据已经成功写入到数据库中!!!
耗时:0.17268037796020508

2. Pipeline模式

import json
import time

import basic
import parse_navis_works

# 获取全部的参数数据
all_data = parse_navis_works.get_redis_data(basic.redis_host, basic.redis_port, basic.redis_password, basic.redis_db)


def main():
    a = time.time()
    # 创建Redis连接
    r = parse_navis_works.connect_redis(basic.redis_host, basic.redis_port, basic.redis_password, basic.redis_db)

    # 创建一个Redis Pipeline
    pipeline = r.pipeline()

    # 在redis数据库中填写数据
    for q_key, trucks in basic.WORK_LINE.items():
        for cur, truck in enumerate(trucks):
            key = f'test:{truck}'
            # 删除原来的数据
            pipeline.delete(key)
            tasks = all_data[q_key][cur]
            for task in tasks:
                # 添加数据
                pipeline.lpush(key, json.dumps(task))

    # 执行批量操作
    pipeline.execute()

    print("车辆初始化完成,数据已经成功写入到redis数据库中!!!")
    b = time.time()
    print(f'耗时:{b - a}')


if __name__ == '__main__':
    main()

车辆初始化完成,数据已经成功写入到redis数据库中!!!
耗时:0.006778717041015625


网站公告

今日签到

点亮在社区的每一天
去签到