У меня есть следующий набор 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?
- Есть ли более эффективный способ сделать это? Переместить запись из одного набора в другой?