REDIS-конвейер не выходит из строя, если одна из команд не работает - PullRequest
0 голосов
/ 11 января 2019

У меня есть следующий набор 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.

кстати. Когда я удаляю опечатку, код удаляется из одного списка и добавляется в другой.

Вопросы

  1. Я думал, что конвейер должен был вернуть все команды в случае сбоя одной из них. Другими словами, поскольку hdel возвращает 0, следует ли отменить hmset?
  2. Есть ли более эффективный способ сделать это? Переместить запись из одного набора в другой?

1 Ответ

0 голосов
/ 11 января 2019

1) Независимо от того, что вы подумали, конвейер - это просто способ пакетных операций без ожидания ответов. Сбой одной или нескольких операций в конвейере * не ** предотвращает и не откатывает другие операции в нем.

2) Это не наборы, а хеши. Вы можете изучить сценарии Lua (см. Команду EVAL), чтобы оптимизировать производительность вашей логики, запустив ее на сервере Redis.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...