我设置了以下红色设置:
127.0.0.1:6379[2]> hgetall available
1) "00001"
2) "unassigned"
3) "00002"
4) "unassigned"
5) "00003"
6) "unassigned"
7) "00004"
8) "unassigned"
9) "00005"
10) "unassigned"
127.0.0.1:6379[2]>
我有以下Python代码,它使用管道将帐户从可用列表“移动”到保留列表/集合:
def reserve_mailboxes(lower, upper):
try:
assert(lower is not None)
assert(upper is not None)
if DEBUG == True: print("reserve_mailboxes invoked with lower limit: " + str(lower) + ", upper limit: " + str(upper))
for number in range(int(lower), int(upper) + 1):
number = '{0:05d}'.format(number) #zero pad
r = redis.Redis(connection_pool=POOL)
p = r.pipeline()
p.hmset('reserved', {number:'reserved'})
p.hdel('available', {number})
response = p.execute()
logging.info(response)
if not response[1] == True:
if DEBUG == True: logging.info(response)
return True
except Exception as e:
logging.error(e)
return False
如果您看一下我创建和执行管道的代码,hdel命令实际上有一个语法错误。真的应该是:
p.hdel('available', number)
然而,当我运行这段代码时,它会继续并将2个条目添加到“预订”列表中……但不会将它们从可用列表中删除。这是我的数据在这一点上的样子:
127.0.0.1:6379[2]> hgetall reserved
1) "00003"
2) "reserved"
3) "00004"
4) "reserved"
127.0.0.1:6379[2]> hgetall available
1) "00001"
2) "unassigned"
3) "00002"
4) "unassigned"
5) "00003"
6) "unassigned"
7) "00004"
8) "unassigned"
9) "00005"
10) "unassigned"
日志显示这两个命令的以下“响应”/结果:
根信息-[True,0]
如果hdel起作用了,它应该返回1而不是0。
顺便说一句。当我删除拼写错误时,代码会正确地从一个列表中删除并添加到另一个列表中。
问题
1.我认为如果其中一个命令失败,流水线应该恢复所有命令。因此,换句话说,既然hdel返回0,那么它是否应该撤销hmset?
1.有没有更有效的方法来做到这一点?要将记录从一组移动到另一组吗?
2条答案
按热度按时间cgvd09ve1#
1.不管你怎么想,管道只是一种在没有等待回复的情况下批量操作的方式。流水线中一个或多个操作的失败并不阻止回滚或其中的其他操作。
1.这些不是集合,而是散列。您可以查看Lua脚本(参见
EVAL
命令),通过在Redis服务器中运行它来优化您的逻辑的性能。vc9ivgsu2#
您可以用
MULTI
和EXEC
Package 流水线命令,使它们成为“原子的”。例如:
有关详细信息,请参阅
EXEC
命令的the doc。