2015-08-02 4 views
7

Я проверил все транзакционные команды (MULTI, EXEC, WATCH, DISCARD) в redis-cli. Но когда я попытался с Redis-Py произошла следующая ошибка:Что такое эквивалентные функции команд MULTI и EXEC в redis-py?

AttributeError: 'Redis' object has no attribute 'multi'

Я попытался следующий фрагмент кода:

import redis,time 

r = redis.Redis() 
try: 
    r.set("transError",10) 
    r.watch("transError") 
    var = r.get("transError") 
    var = int(var) + 1 
    print "Run other client to simulate an error without transaction" 
    time.sleep(4) 
    r.multi() 
    r.set("transError",var) 
    r.execute() 
    print "Value in first client",r.get("transError") 

except redis.WatchError: 
    print "Value Altered" 

Я видел пример кода, который использует несколько() и выполнить() но они не работают для меня. Любая помощь?

ответ

13

В redis-py MULTI и EXEC могут использоваться только через объект Pipeline.

Попробуйте следующее:

r = redis.Redis() 
p = r.pipeline() 
p.set("transError", var) 
p.execute() 

С командой monitor через redis-cli вы можете увидеть MULTI, SET, EXEC посылается, когда p.execute() называется. Чтобы опустить пару MULTI/EXEC, используйте r.pipeline(transaction=False).

+0

Этот ответ выглядит идеально. Хотя у меня есть один вопрос: сколько команд можно эффективно выполнять вместе? это нормально, если я передаю 500000 команд в одном конвейере или это будет слишком много для redis? –

+0

@TusharJDudhatra Вам действительно нужно измерить это для себя для вашего индивидуального приложения. По моему опыту, хотя обычно предпочтительнее выставлять только разумное количество команд вместе ... как 10000 из них. Также в redis-py конвейер отправляет все команды сразу при его выполнении, а не непрерывно, независимо от транзакции = False. См. Https://redis.io/topics/pipelining https://github.com/schlitzered/pyredis/issues/2 – ntki

+0

Благодарим за отзыв. Да, я попробовал выполнить команды 500K в одном конвейере, и он прошел гладко для меня. –

 Смежные вопросы

  • Нет связанных вопросов^_^