Python Redis流水线发送200条指令,只有189条答案
我正在学习Redis,我被流水线的概念所阻碍,我试图将指令发送到我的Redis服务器 为此,我使用一个套接字连接到我正在使用的redis服务器 这是我的密码(我是法国人,所以有些单词是法语) 下面是我使用管道的方式:Python Redis流水线发送200条指令,只有189条答案,python,redis,pipelining,Python,Redis,Pipelining,我正在学习Redis,我被流水线的概念所阻碍,我试图将指令发送到我的Redis服务器 为此,我使用一个套接字连接到我正在使用的redis服务器 这是我的密码(我是法国人,所以有些单词是法语) 下面是我使用管道的方式: instruction ='SET compteur 0' donnee = instruction.encode('utf-8') + '\x0D\x0A' print envoie(donnee) instruction='' for i in range(200):
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 computer,但后面是:
:1
:2
:3
:4
....
:185
:186
:187
:188
:189
有人有解释吗?另外,如果我使用另一条指令,例如GET编译器,我只有147+PONG,正如Edgar建议的那样,请使用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个乒乓球(或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]
正如Edgar所建议的,使用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个乒乓球(或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和指令后的EXEC。这将保证原子性并获得执行命令的所有结果。看看文档 也请阅读有关。这里有很多有用的信息 事实上,我猜你们的问题是,你们可以在Redis返回答案之前开始阅读答案 虽然flow submitRequest->receiveResults的逻辑看起来不错,但您的代码不能以这种方式工作,因为Redis异步执行操作 事实上,您的代码以下一种方式读取:将数据(指令)发送到服务器->从套接字读取一些数据(结果|结果的一部分|什么都没有?)。问题是我们不需要等待Redis完成计算
我对Python不太在行,但我想如果存在
data=s.recv(BUFFER\u SIZE)
将从s
读取多达“BUFFER\u SIZE”字节。但如果套接字中只存在部分结果,则此命令只返回这些部分数据。处理套接字的读取并不是像其他人建议的那样简单的操作-使用已经存在的库-您可以在指令周围添加两个命令:MULTI-before和EXEC-before。这将保证原子性并获得执行命令的所有结果。看看文档
也请阅读有关。这里有很多有用的信息
事实上,我猜你们的问题是,你们可以在Redis返回答案之前开始阅读答案
虽然flow submitRequest->receiveResults的逻辑看起来不错,但您的代码不能以这种方式工作,因为Redis异步执行操作
事实上,您的代码以下一种方式读取:将数据(指令)发送到服务器->从套接字读取一些数据(结果|结果的一部分|什么都没有?)。问题是我们不需要等待Redis完成计算
我对Python不太在行,但我想如果存在
data=s.recv(BUFFER\u SIZE)
将从s
读取多达“BUFFER\u SIZE”字节。但如果套接字中只存在部分结果,则此命令只返回这些部分数据。处理套接字的读取并不像其他人建议的那样简单——使用已经存在的库——为什么不使用redis适配器代替手工定义套接字呢?我不能使用redis Adapter,因为这段代码将在PLC上实现,而PLC不提供redis,它只有python,所以我必须这样做,但是感谢您的建议,为什么不使用redis Adapter for python,而不是手动定义套接字呢?我不能使用redis Adapter,因为这段代码将在一个PLC上实现,该PLC不提供redis,它只有python,所以我必须这样做,但是谢谢你的建议谢谢你的回答,我没有意识到我的缓冲区这么小,我只是增加了它,它工作得很好。我现在正在阅读关于流水线的文章,这可能是对我的代码的一个很大的改进。谢谢你的回答,我没有意识到我的缓冲区太小了,我只是增加了它,它工作得很好。我现在正在阅读关于流水线的文章,这可能是对我代码的一个很大的改进。谢谢你,dizzyf,但我不能使用这种方法,这个程序将被上传到一个机器人上,这个机器人不会配备redis,它只会像我写的那样“讲”一些指令。但是谢谢你的回答,我会用一个不同的程序。谢谢你,dizzyf,但我不能用这个方法,这个程序将被上传到一个机器人上,这个机器人不会配备redis,它只会像我写的那样“说”一点指令。但是谢谢你的回答,我会用另一个程序。