目录
一、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