python redis lpush失败:缓冲区长度不足

时间:2015-07-24 14:23:00

标签: python redis

我将相对大量的密钥插入redis服务器(大约1-2百万)。以下两个片段直接来自文档,其中第一个使用单个插入,第二个使用流水线。

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for i in keys:
    vals = [...] # some long list
    r.lpush(i, *vals)

-

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
pipe = r.pipeline()
for i in keys:
    vals = [...] # some long list
    pipe.lpush(i, *vals)
pipe.execute()

两种方法都失败了,其中python错误是

ConnectionError: Error 32 while writing to socket. Broken pipe.

其中只有第二种方法也会在redis-server日志中抛出错误:

 Closing client that reached max query buffer length [..]

有趣的是,自从我使用lists以来,我才遇到过这样的错误。第三个版本完美无缺:

import redis
import pickle
r = redis.StrictRedis(host='localhost', port=6379, db=0)
pipe = r.pipeline()
for i in keys:
    vals = [...] # some long list
    pipe.set(i, pickle.dumps(vals))
pipe.execute()

但是我想切换到redis列表,因为在大型列表中,反向(pickle.loads)效率很低。

问题:我是否因使用lpush而遗漏了某些内容,或者Broken管道是否常见?是否可以配置redis-server以允许更大的缓冲区大小(在我的情况下,作为python dict数据消耗大约10 - 15GB内存)?

0 个答案:

没有答案