我将相对大量的密钥插入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内存)?