这里原来的脚本我看到拉取和插入redis数据要花很长时间且很耗时。
于是想到了使用 pipeline, 这个是redis自带的批量执行命令的
这里只演示读写 redis的list数据类型的读写,且读出来是删除的方式
from config import REDIS_IP, REDIS_PORT, REDIS_PASSWORD
import redis
import time
key ="xxxxx"
def get_redi_conn(ip, port, passwd):
conn = redis.StrictRedis(host=ip, port=port, password=passwd, decode_responses=True)
return conn
def redis_push(conn):
with conn.pipeline(transaction=False) as p:
for i in range(100000):
p.lpush(key,i)
p.execute()
def redis_len(conn):
count = conn.llen(key)
print("插入数据总数")
print(count)
return count
def redis_get(conn):
data = []
count = redis_len(conn)
with conn.pipeline(transaction=False) as p:
for i in range(count):
p.rpop(key)
datas = p.execute()
print("读取总数")
print(len(datas ))
def main():
conn = get_redi_conn(REDIS_IP, REDIS_PORT, REDIS_PASSWORD)
print("开始测试使用redis管道写redis数据的时间")
write_start = time.time()
redis_push(conn)
write_end = time.time()
print("消耗时间: ")
print(write_end-write_start)
print("开始测试使用redis管道读redis数据的时间")
read_start = time.time()
redis_get(conn)
read_end = time.time()
print("消耗时间: ")
print(read_end-read_start)
if __name__ == "__main__":
main()
执行
在我的测试下10w数据的读要9s 写也要9s。1w的话差不多0.9s左右。
之后尝试看能不能更快一些的读写数据。
下图是我使用了最简单的读写方式进行了对比。(测试了1w的数据)
可以看到执行特别耗时
from config import REDIS_IP, REDIS_PORT, REDIS_PASSWORD
import redis
import time
key ="ssssss"
def get_redi_conn(ip, port, passwd):
conn = redis.StrictRedis(host=ip, port=port, password=passwd, decode_responses=True)
return conn
def redis_push(conn):
for i in range(10000):
conn.lpush(key,i)
def redis_len(conn):
count = conn.llen(key)
print("插入数据总数")
print(count)
def redis_get(conn):
data = []
value = conn.rpop(key)
while value:
data.append(value)
value = conn.rpop(key)
print("读取总数")
print(len(data))
def main():
conn = get_redi_conn(REDIS_IP, REDIS_PORT, REDIS_PASSWORD)
print("开始测试正常写redis数据的时间")
write_start = time.time()
redis_push(conn)
write_end = time.time()
print("消耗时间: ")
print(write_end-write_start)
print("开始测试正常读redis数据的时间")
read_start = time.time()
redis_get(conn)
read_end = time.time()
print("消耗时间: ")
print(read_end-read_start)
if __name__ == "__main__":
main()
redis相关也不是很熟悉,若有问题感谢指出。
参考:
https://redis.io/topics/pipelining
https://www.cnblogs.com/kangoroo/p/7647052.html