REDIS-如果其中一个命令不';行不通

REDIS-如果其中一个命令不';行不通,redis,Redis,我设置了以下REDIS: 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代码,它使用管道将帐户从可用列表“移动

我设置了以下REDIS:

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"
日志显示两个命令的以下“响应”/结果:

root-INFO-[True,0]

如果hdel工作,它应该返回1而不是0

顺便说一句,当我删除输入错误时,代码会正确地从一个列表中删除,并添加到另一个列表中

问题

  • 我认为如果其中一个命令失败,管道应该恢复所有命令。换句话说,既然hdel返回0,它是否应该撤消hmset
  • 有没有更有效的方法?将记录从一组移动到另一组
  • 1) 不管您怎么想,管道只是一种批处理操作的方式,不需要等待回复。管道*中的一个或多个操作失败**不会阻止管道*中的其他操作回滚


    2) 这些不是集合,而是散列。您可以研究Lua脚本(参见命令),通过在Redis服务器中运行逻辑来优化逻辑的性能。

    您可以使用
    MULTI
    EXEC
    包装流水线命令,使其成为“原子”命令

    例如:

    MULTI
    INCR pipeline_counter
    EXPIRE pipeline_counts 3600
    EXEC
    
    有关更多信息,请参阅执行命令的部分