Pipelines and transactions
Learn how to use Redis pipelines and transactions
Redis lets you send a sequence of commands to the server together in a batch. There are two types of batch that you can use:
- Pipelines avoid network and processing overhead by sending several commands to the server together in a single communication. The server then sends back a single communication with all the responses. See the Pipelining page for more information.
- Transactions guarantee that all the included commands will execute to completion without being interrupted by commands from other clients. See the Transactions page for more information.
Execute a pipeline
There is no command to explicitly start a pipeline with hiredis
,
but if you issue a command with the redisAppendCommand()
function,
it will be added to an output buffer without being sent
immediately to the server.
There is also an input buffer that receives replies from
commands. If you call redisGetReply()
when the input buffer is empty,
it will first send any commands that are queued in the output buffer and
then wait for replies to arrive in the input buffer. It will then return
the first reply only.
If you then make subsequent redisGetReply()
calls, they will
find the input buffer is not empty, but still has replies
queued from previous commands. In this case, redisGetReply()
will just remove and return replies from the input buffer
until it is empty again.
The example below shows how to use redisAppendCommand()
and redisGetReply()
together:
redisAppendCommand(c, "SET fruit:0 Apple");
redisAppendCommand(c, "SET fruit:1 Banana");
redisAppendCommand(c, "SET fruit:2 Cherry");
redisAppendCommand(c, "GET fruit:0");
redisAppendCommand(c, "GET fruit:1");
redisAppendCommand(c, "GET fruit:2");
redisReply *reply;
// Iterate once for each of the six commands in the
// pipeline.
for (int i = 0; i < 6; ++i) {
redisGetReply(c, (void**) &reply);
// If an error occurs, the context object will
// contain an error code and/or an error string.
if (reply->type == REDIS_REPLY_ERROR) {
printf("Error: %s", c->errstr);
} else {
printf("%s\n", reply->str);
}
freeReplyObject(reply);
}
// >>> OK
// >>> OK
// >>> OK
// >>> Apple
// >>> Banana
// >>> Cherry
redisAppendCommand()
has the same call signature as redisCommand()
except that
it doesn't return a redisReply
. There is also a redisAppendCommandArgv()
function that is analogous to redisCommandArgv()
(see
Issue commands
for more information).
redisGetReply()
receives the usual
context pointer and a pointer to a redisReply
pointer (which you
must cast to void**
). After redisGetReply()
returns,
the reply pointer will point to the redisReply
object returned by
the queued command (see
Handle command replies
for more information).
Call redisGetReply()
once for each command that you added to the pipeline.
You should check for errors after each call and free each reply object
when you have finished processing it, as in the example above.
Transactions
hiredis
doesn't provide any special API to handle transactions, but
you can implement them yourself using the MULTI
,
EXEC
, and WATCH
commands as you would from redis-cli
.
See Transactions
for more information.