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

2024-06-28 19:18:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

为此,我使用了一个套接字,它将连接到我正在使用的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


Tags: redissendmessagedata指令socketutftcp
2条回答

正如Edgar所建议的,使用redis-pypython库来帮助管理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]

您可以在指令周围添加两个命令:MULTI before和EXEC after。这将保证原子性并获得执行命令的所有结果。看看transaction文档。你知道吗

请同时阅读pipelining。这里有很多有用的信息。你知道吗

事实上,我猜你的问题是,你可以开始阅读答案之前,Redis返回它。你知道吗

虽然flow submitRequest->;receiveResults的逻辑看起来不错,但是您的代码不能以这种方式工作,因为Redis异步执行操作。你知道吗

事实上,您的代码以下一种方式读取:将数据(指令)发送到服务器->;从套接字读取一些数据(结果|结果的一部分|什么都没有?)。问题是我们不等待Redis完成计算。你知道吗

我不擅长Python,但我猜data = s.recv(BUFFER_SIZE)将从s读取多达'BUFFER\u SIZE'字节(如果存在的话)。但如果套接字中只存在部分结果,则此命令只返回这部分数据。处理从套接字读取的操作并不像其他人建议的那样简单-使用已经存在的库-https://redis.io/clients#python

相关问题 更多 >