python redis 列表插入 速度太慢

pool = redis.ConnectionPool(host=host, port=port)
client = redis.StrictRedis(connection_pool=pool)

for i in range(10000):
    for j in range(30):
        client.lpush(IDLE_TASKS, json.dumps(args))
 

这种执行效率低的可怕。
需要等几十秒,才能插入完成。
请问有没更高效率的处理手法?

args 只是以一个元组内容随意(1,2,"3")之类

阅读 6.8k
3 个回答

用 Redis 的 Pipeline , 先在循环内生成数据,最后一次性插入

>>> p = r.pipeline()        --创建一个管道
>>> p.set('hello','redis')
>>> p.sadd('faz','baz')
>>> p.incr('num')
>>> p.execute()        -- 执行管道内命令
[True, 1, 1]

>>> r.get('hello')
'redis'

pool = redis.ConnectionPool(host=host, port=port)
client = redis.StrictRedis(connection_pool=pool)

p = client.pipeline()
for i in range(10000):
    for j in range(30):
        p.lpush(IDLE_TASKS, json.dumps(args))
p.execute()   

使用管道,Redis 会将命令暂时存储,当遇到 execute() 时才会执行,所以上面代码只需要和 Redis 服务器通信一次即可将数据全部插入

参考链接: https://redis.io/topics/pipel...

因为我个人没用过redis这个库, 所以只能尝试从你给出的代码去给些建议, 不喜勿喷:

1.不知道你的这个args是哪来的, 但是在这个循环体中, 似乎没看到改变, 所以能否将这个json.dumps(args)放到循环体外面执行:

args_dump = json.dumps(args)
for i in range(10000):
    for j in range(30):
        client.lpush(IDLE_TASKS, args_dump)

2.看到你大概要生成30万的同样的数据, 能否将这个数据先生成, 再一次性client.lpush? 因为毕竟tcp也有自身的延迟因素

3.可以通过cProfile库去找出耗时长的地方, 也可以尝试换别的库去实现(这个具体得自己去google了)

json.dumps(args) 这种能提前做的语句最好移到循环体外,30万次呢

一般数据库要多条数据一次插入才高效,避免一次插一条。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏