README.md
1[](https://travis-ci.org/redis/hiredis)
2
3**This Readme reflects the latest changed in the master branch. See [v0.13.3](https://github.com/redis/hiredis/tree/v0.13.3) for the Readme and documentation for the latest release.**
4
5# HIREDIS
6
7Hiredis is a minimalistic C client library for the [Redis](http://redis.io/) database.
8
9It is minimalistic because it just adds minimal support for the protocol, but
10at the same time it uses a high level printf-alike API in order to make it
11much higher level than otherwise suggested by its minimal code base and the
12lack of explicit bindings for every Redis command.
13
14Apart from supporting sending commands and receiving replies, it comes with
15a reply parser that is decoupled from the I/O layer. It
16is a stream parser designed for easy reusability, which can for instance be used
17in higher level language bindings for efficient reply parsing.
18
19Hiredis only supports the binary-safe Redis protocol, so you can use it with any
20Redis version >= 1.2.0.
21
22The library comes with multiple APIs. There is the
23*synchronous API*, the *asynchronous API* and the *reply parsing API*.
24
25## Upgrading to `1.0.0`
26
27Version 1.0.0 marks a stable release of hiredis.
28It includes some minor breaking changes, mostly to make the exposed API more uniform and self-explanatory.
29It also bundles the updated `sds` library, to sync up with upstream and Redis.
30For most applications a recompile against the new hiredis should be enough.
31For code changes see the [Changelog](CHANGELOG.md).
32
33## Upgrading from `<0.9.0`
34
35Version 0.9.0 is a major overhaul of hiredis in every aspect. However, upgrading existing
36code using hiredis should not be a big pain. The key thing to keep in mind when
37upgrading is that hiredis >= 0.9.0 uses a `redisContext*` to keep state, in contrast to
38the stateless 0.0.1 that only has a file descriptor to work with.
39
40## Synchronous API
41
42To consume the synchronous API, there are only a few function calls that need to be introduced:
43
44```c
45redisContext *redisConnect(const char *ip, int port);
46void *redisCommand(redisContext *c, const char *format, ...);
47void freeReplyObject(void *reply);
48```
49
50### Connecting
51
52The function `redisConnect` is used to create a so-called `redisContext`. The
53context is where Hiredis holds state for a connection. The `redisContext`
54struct has an integer `err` field that is non-zero when the connection is in
55an error state. The field `errstr` will contain a string with a description of
56the error. More information on errors can be found in the **Errors** section.
57After trying to connect to Redis using `redisConnect` you should
58check the `err` field to see if establishing the connection was successful:
59```c
60redisContext *c = redisConnect("127.0.0.1", 6379);
61if (c == NULL || c->err) {
62 if (c) {
63 printf("Error: %s\n", c->errstr);
64 // handle error
65 } else {
66 printf("Can't allocate redis context\n");
67 }
68}
69```
70
71*Note: A `redisContext` is not thread-safe.*
72
73### Sending commands
74
75There are several ways to issue commands to Redis. The first that will be introduced is
76`redisCommand`. This function takes a format similar to printf. In the simplest form,
77it is used like this:
78```c
79reply = redisCommand(context, "SET foo bar");
80```
81
82The specifier `%s` interpolates a string in the command, and uses `strlen` to
83determine the length of the string:
84```c
85reply = redisCommand(context, "SET foo %s", value);
86```
87When you need to pass binary safe strings in a command, the `%b` specifier can be
88used. Together with a pointer to the string, it requires a `size_t` length argument
89of the string:
90```c
91reply = redisCommand(context, "SET foo %b", value, (size_t) valuelen);
92```
93Internally, Hiredis splits the command in different arguments and will
94convert it to the protocol used to communicate with Redis.
95One or more spaces separates arguments, so you can use the specifiers
96anywhere in an argument:
97```c
98reply = redisCommand(context, "SET key:%s %s", myid, value);
99```
100
101### Using replies
102
103The return value of `redisCommand` holds a reply when the command was
104successfully executed. When an error occurs, the return value is `NULL` and
105the `err` field in the context will be set (see section on **Errors**).
106Once an error is returned the context cannot be reused and you should set up
107a new connection.
108
109The standard replies that `redisCommand` are of the type `redisReply`. The
110`type` field in the `redisReply` should be used to test what kind of reply
111was received:
112
113* **`REDIS_REPLY_STATUS`**:
114 * The command replied with a status reply. The status string can be accessed using `reply->str`.
115 The length of this string can be accessed using `reply->len`.
116
117* **`REDIS_REPLY_ERROR`**:
118 * The command replied with an error. The error string can be accessed identical to `REDIS_REPLY_STATUS`.
119
120* **`REDIS_REPLY_INTEGER`**:
121 * The command replied with an integer. The integer value can be accessed using the
122 `reply->integer` field of type `long long`.
123
124* **`REDIS_REPLY_NIL`**:
125 * The command replied with a **nil** object. There is no data to access.
126
127* **`REDIS_REPLY_STRING`**:
128 * A bulk (string) reply. The value of the reply can be accessed using `reply->str`.
129 The length of this string can be accessed using `reply->len`.
130
131* **`REDIS_REPLY_ARRAY`**:
132 * A multi bulk reply. The number of elements in the multi bulk reply is stored in
133 `reply->elements`. Every element in the multi bulk reply is a `redisReply` object as well
134 and can be accessed via `reply->element[..index..]`.
135 Redis may reply with nested arrays but this is fully supported.
136
137Replies should be freed using the `freeReplyObject()` function.
138Note that this function will take care of freeing sub-reply objects
139contained in arrays and nested arrays, so there is no need for the user to
140free the sub replies (it is actually harmful and will corrupt the memory).
141
142**Important:** the current version of hiredis (0.10.0) frees replies when the
143asynchronous API is used. This means you should not call `freeReplyObject` when
144you use this API. The reply is cleaned up by hiredis _after_ the callback
145returns. This behavior will probably change in future releases, so make sure to
146keep an eye on the changelog when upgrading (see issue #39).
147
148### Cleaning up
149
150To disconnect and free the context the following function can be used:
151```c
152void redisFree(redisContext *c);
153```
154This function immediately closes the socket and then frees the allocations done in
155creating the context.
156
157### Sending commands (cont'd)
158
159Together with `redisCommand`, the function `redisCommandArgv` can be used to issue commands.
160It has the following prototype:
161```c
162void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
163```
164It takes the number of arguments `argc`, an array of strings `argv` and the lengths of the
165arguments `argvlen`. For convenience, `argvlen` may be set to `NULL` and the function will
166use `strlen(3)` on every argument to determine its length. Obviously, when any of the arguments
167need to be binary safe, the entire array of lengths `argvlen` should be provided.
168
169The return value has the same semantic as `redisCommand`.
170
171### Pipelining
172
173To explain how Hiredis supports pipelining in a blocking connection, there needs to be
174understanding of the internal execution flow.
175
176When any of the functions in the `redisCommand` family is called, Hiredis first formats the
177command according to the Redis protocol. The formatted command is then put in the output buffer
178of the context. This output buffer is dynamic, so it can hold any number of commands.
179After the command is put in the output buffer, `redisGetReply` is called. This function has the
180following two execution paths:
181
1821. The input buffer is non-empty:
183 * Try to parse a single reply from the input buffer and return it
184 * If no reply could be parsed, continue at *2*
1852. The input buffer is empty:
186 * Write the **entire** output buffer to the socket
187 * Read from the socket until a single reply could be parsed
188
189The function `redisGetReply` is exported as part of the Hiredis API and can be used when a reply
190is expected on the socket. To pipeline commands, the only things that needs to be done is
191filling up the output buffer. For this cause, two commands can be used that are identical
192to the `redisCommand` family, apart from not returning a reply:
193```c
194void redisAppendCommand(redisContext *c, const char *format, ...);
195void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
196```
197After calling either function one or more times, `redisGetReply` can be used to receive the
198subsequent replies. The return value for this function is either `REDIS_OK` or `REDIS_ERR`, where
199the latter means an error occurred while reading a reply. Just as with the other commands,
200the `err` field in the context can be used to find out what the cause of this error is.
201
202The following examples shows a simple pipeline (resulting in only a single call to `write(2)` and
203a single call to `read(2)`):
204```c
205redisReply *reply;
206redisAppendCommand(context,"SET foo bar");
207redisAppendCommand(context,"GET foo");
208redisGetReply(context,&reply); // reply for SET
209freeReplyObject(reply);
210redisGetReply(context,&reply); // reply for GET
211freeReplyObject(reply);
212```
213This API can also be used to implement a blocking subscriber:
214```c
215reply = redisCommand(context,"SUBSCRIBE foo");
216freeReplyObject(reply);
217while(redisGetReply(context,&reply) == REDIS_OK) {
218 // consume message
219 freeReplyObject(reply);
220}
221```
222### Errors
223
224When a function call is not successful, depending on the function either `NULL` or `REDIS_ERR` is
225returned. The `err` field inside the context will be non-zero and set to one of the
226following constants:
227
228* **`REDIS_ERR_IO`**:
229 There was an I/O error while creating the connection, trying to write
230 to the socket or read from the socket. If you included `errno.h` in your
231 application, you can use the global `errno` variable to find out what is
232 wrong.
233
234* **`REDIS_ERR_EOF`**:
235 The server closed the connection which resulted in an empty read.
236
237* **`REDIS_ERR_PROTOCOL`**:
238 There was an error while parsing the protocol.
239
240* **`REDIS_ERR_OTHER`**:
241 Any other error. Currently, it is only used when a specified hostname to connect
242 to cannot be resolved.
243
244In every case, the `errstr` field in the context will be set to hold a string representation
245of the error.
246
247## Asynchronous API
248
249Hiredis comes with an asynchronous API that works easily with any event library.
250Examples are bundled that show using Hiredis with [libev](http://software.schmorp.de/pkg/libev.html)
251and [libevent](http://monkey.org/~provos/libevent/).
252
253### Connecting
254
255The function `redisAsyncConnect` can be used to establish a non-blocking connection to
256Redis. It returns a pointer to the newly created `redisAsyncContext` struct. The `err` field
257should be checked after creation to see if there were errors creating the connection.
258Because the connection that will be created is non-blocking, the kernel is not able to
259instantly return if the specified host and port is able to accept a connection.
260
261*Note: A `redisAsyncContext` is not thread-safe.*
262
263```c
264redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379);
265if (c->err) {
266 printf("Error: %s\n", c->errstr);
267 // handle error
268}
269```
270
271The asynchronous context can hold a disconnect callback function that is called when the
272connection is disconnected (either because of an error or per user request). This function should
273have the following prototype:
274```c
275void(const redisAsyncContext *c, int status);
276```
277On a disconnect, the `status` argument is set to `REDIS_OK` when disconnection was initiated by the
278user, or `REDIS_ERR` when the disconnection was caused by an error. When it is `REDIS_ERR`, the `err`
279field in the context can be accessed to find out the cause of the error.
280
281The context object is always freed after the disconnect callback fired. When a reconnect is needed,
282the disconnect callback is a good point to do so.
283
284Setting the disconnect callback can only be done once per context. For subsequent calls it will
285return `REDIS_ERR`. The function to set the disconnect callback has the following prototype:
286```c
287int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn);
288```
289### Sending commands and their callbacks
290
291In an asynchronous context, commands are automatically pipelined due to the nature of an event loop.
292Therefore, unlike the synchronous API, there is only a single way to send commands.
293Because commands are sent to Redis asynchronously, issuing a command requires a callback function
294that is called when the reply is received. Reply callbacks should have the following prototype:
295```c
296void(redisAsyncContext *c, void *reply, void *privdata);
297```
298The `privdata` argument can be used to curry arbitrary data to the callback from the point where
299the command is initially queued for execution.
300
301The functions that can be used to issue commands in an asynchronous context are:
302```c
303int redisAsyncCommand(
304 redisAsyncContext *ac, redisCallbackFn *fn, void *privdata,
305 const char *format, ...);
306int redisAsyncCommandArgv(
307 redisAsyncContext *ac, redisCallbackFn *fn, void *privdata,
308 int argc, const char **argv, const size_t *argvlen);
309```
310Both functions work like their blocking counterparts. The return value is `REDIS_OK` when the command
311was successfully added to the output buffer and `REDIS_ERR` otherwise. Example: when the connection
312is being disconnected per user-request, no new commands may be added to the output buffer and `REDIS_ERR` is
313returned on calls to the `redisAsyncCommand` family.
314
315If the reply for a command with a `NULL` callback is read, it is immediately freed. When the callback
316for a command is non-`NULL`, the memory is freed immediately following the callback: the reply is only
317valid for the duration of the callback.
318
319All pending callbacks are called with a `NULL` reply when the context encountered an error.
320
321### Disconnecting
322
323An asynchronous connection can be terminated using:
324```c
325void redisAsyncDisconnect(redisAsyncContext *ac);
326```
327When this function is called, the connection is **not** immediately terminated. Instead, new
328commands are no longer accepted and the connection is only terminated when all pending commands
329have been written to the socket, their respective replies have been read and their respective
330callbacks have been executed. After this, the disconnection callback is executed with the
331`REDIS_OK` status and the context object is freed.
332
333### Hooking it up to event library *X*
334
335There are a few hooks that need to be set on the context object after it is created.
336See the `adapters/` directory for bindings to *libev* and *libevent*.
337
338## Reply parsing API
339
340Hiredis comes with a reply parsing API that makes it easy for writing higher
341level language bindings.
342
343The reply parsing API consists of the following functions:
344```c
345redisReader *redisReaderCreate(void);
346void redisReaderFree(redisReader *reader);
347int redisReaderFeed(redisReader *reader, const char *buf, size_t len);
348int redisReaderGetReply(redisReader *reader, void **reply);
349```
350The same set of functions are used internally by hiredis when creating a
351normal Redis context, the above API just exposes it to the user for a direct
352usage.
353
354### Usage
355
356The function `redisReaderCreate` creates a `redisReader` structure that holds a
357buffer with unparsed data and state for the protocol parser.
358
359Incoming data -- most likely from a socket -- can be placed in the internal
360buffer of the `redisReader` using `redisReaderFeed`. This function will make a
361copy of the buffer pointed to by `buf` for `len` bytes. This data is parsed
362when `redisReaderGetReply` is called. This function returns an integer status
363and a reply object (as described above) via `void **reply`. The returned status
364can be either `REDIS_OK` or `REDIS_ERR`, where the latter means something went
365wrong (either a protocol error, or an out of memory error).
366
367The parser limits the level of nesting for multi bulk payloads to 7. If the
368multi bulk nesting level is higher than this, the parser returns an error.
369
370### Customizing replies
371
372The function `redisReaderGetReply` creates `redisReply` and makes the function
373argument `reply` point to the created `redisReply` variable. For instance, if
374the response of type `REDIS_REPLY_STATUS` then the `str` field of `redisReply`
375will hold the status as a vanilla C string. However, the functions that are
376responsible for creating instances of the `redisReply` can be customized by
377setting the `fn` field on the `redisReader` struct. This should be done
378immediately after creating the `redisReader`.
379
380For example, [hiredis-rb](https://github.com/pietern/hiredis-rb/blob/master/ext/hiredis_ext/reader.c)
381uses customized reply object functions to create Ruby objects.
382
383### Reader max buffer
384
385Both when using the Reader API directly or when using it indirectly via a
386normal Redis context, the redisReader structure uses a buffer in order to
387accumulate data from the server.
388Usually this buffer is destroyed when it is empty and is larger than 16
389KiB in order to avoid wasting memory in unused buffers
390
391However when working with very big payloads destroying the buffer may slow
392down performances considerably, so it is possible to modify the max size of
393an idle buffer changing the value of the `maxbuf` field of the reader structure
394to the desired value. The special value of 0 means that there is no maximum
395value for an idle buffer, so the buffer will never get freed.
396
397For instance if you have a normal Redis context you can set the maximum idle
398buffer to zero (unlimited) just with:
399```c
400context->reader->maxbuf = 0;
401```
402This should be done only in order to maximize performances when working with
403large payloads. The context should be set back to `REDIS_READER_MAX_BUF` again
404as soon as possible in order to prevent allocation of useless memory.
405
406## AUTHORS
407
408Hiredis was written by Salvatore Sanfilippo (antirez at gmail) and
409Pieter Noordhuis (pcnoordhuis at gmail) and is released under the BSD license.
410Hiredis is currently maintained by Matt Stancliff (matt at genges dot com) and
411Jan-Erik Rediger (janerik at fnordig dot com)
412