Redis流水线发送200条指令,只有189条答案

时间:2017-04-20 15:01:05

标签: python redis pipelining

我正在学习Redis,我被流水线概念所阻止,我正在尝试向redis服务器发送指令

这样做我使用socket whitch将连接到我正在使用的redis服务器。

这是我的代码(我是法语,所以有些单词会用法语)

def send(MESSAGE):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(MESSAGE)
    data = s.recv(BUFFER_SIZE)
    s.close()
    print "Envoi requete PC:", MESSAGE
    return data

以下是我使用流水线的方式:

instruction ='SET compteur 0'
donnee = instruction.encode('utf-8') + '\x0D\x0A'
print envoie(donnee)
instruction=''
for i in range(200):
    instruction = instruction + 'INCR compteur\r\n'
donnee = instruction.encode('utf-8') + '\x0D\x0A'
print send(donnee)

当我这样做时,shell给了我200 INCR compteur,但后面跟着:

:1
:2
:3
:4
....
:185
:186
:187
:188
:189

有人有解释吗?另外,如果我使用另一条指令,例如使用GET compteur,我只有147 + PONG

2 个答案:

答案 0 :(得分:0)

正如Edgar建议的那样,使用redis-py python库来帮助管理你的redis连接。

使用:

from redis import StrictRedis

r = StrictRedis(host='localhost', db=1)
pipe = r.pipeline()

for i in xrange(100):
    pipe.ping()

results = pipe.execute()

print len(results) 

按预期正确显示100 PONG(或True)。

使用INCR进行类似的测试:

for j in xrange(100):
    pipe.incr("test-incr", 1)

results = pipe.execute()

print len(results)
print results[95:100]

返回:

100
[96, 97, 98, 99, 100]

答案 1 :(得分:0)

你可以在你的实践中添加两个命令:MULTI之前和EXEC之后的指令。这将保证原子性并获得执行命令的所有结果。查看transaction文档。

请阅读pipelining。这里有很多有用的信息。

事实上,我猜你的问题是你可以在Redis退回之前开始阅读答案。

虽然流程的逻辑提交请求 - > receiveResults看起来不错,但是你的代码不能以这种方式工作,因为Redis以异步方式执行操作。

实际上,您的代码以下一种方式读取:将数据(指令)发送到服务器 - >从socket读取一些数据(结果|结果的一部分|什么?)。问题是我们不能等待Redis完成计算。

我不擅长Python,但我想data = s.recv(BUFFER_SIZE)会读到' BUFFER_SIZE'来自s的字节(如果存在)。但是如果套接字中只有部分结果存在,则此命令仅返回这些数据部分。正如其他人所建议的那样,处理来自套接字的读取操作并不是那么简单 - 使用已经存在的库 - https://redis.io/clients#python