Question :
In redis
, it says:
A Redis transaction is entered using the MULTI command.
For its Python
API:
r = redis.Redis(...)
pipe = r.pipeline()
current_value = pipe.get('someKey')
#pipe.multi()
pipe.set('someKey', current_value + 1)
pipe.execute()
What is the difference between with and without pipe.multi()
?
To guarantee its atomic, what's the correct solution?
Answer:
Pipelining
is a mechanism that saves you the (RTT) Round Trip Time, when you actually want to batch the update/query of keys and you don't need the reply back for each key by itself.
Multi
will actually make the transaction atomic; so a set of commands being combined into one command, an example would be:
MULTI
SADD foo a
SADD foo b
EXEC
If someone queries for the value of foo
before OR during the transaction is happening they will get NULL
while someone queries after the transaction is finished will get a,b
, so there is no chance that you will be getting a
by itself.
The Python/Redis API reference is setting it by default to MULTI
and you can set it to false if you dont need it , MULTI/EXEC: These are implemented as part of the Pipeline class. The pipeline is wrapped with the MULTI and EXEC statements by default when it is executed, which can be disabled by specifying transaction=False.
Reference