Update README
This commit is contained in:
parent
b028dda359
commit
ec01a80d39
145
README.md
145
README.md
@ -1,116 +1,113 @@
|
|||||||
HIREDIS OVERVIEW
|
# HIREDIS
|
||||||
----------------
|
|
||||||
|
|
||||||
Hiredis is a minimalistic C client library for the Redis Database.
|
Hiredis is a minimalistic C client library for the [Redis](http://redis.io/) database.
|
||||||
|
|
||||||
It is minimalistic because it just adds minimal support for the protocol, but
|
It is minimalistic because it just adds minimal support for the protocol, but
|
||||||
at the same time it uses an high level printf-alike API in order to make it
|
at the same time it uses an high level printf-alike API in order to make it
|
||||||
much higher level than otherwise suggested by its minimal code base and the
|
much higher level than otherwise suggested by its minimal code base and the
|
||||||
lack of explicit bindings for every Redis command.
|
lack of explicit bindings for every Redis command.
|
||||||
|
|
||||||
Hiredis only supports the new Redis protocol, so you can use it with any
|
Apart from supporting sending commands and receiving replies, it comes with
|
||||||
|
a reply parser that is decoupled from the I/O layer. It
|
||||||
|
is a stream parser designed for easy reusability, which can for instance be used
|
||||||
|
in higher level language bindings for efficient reply parsing.
|
||||||
|
|
||||||
|
Hiredis only supports the binary-safe Redis protocol, so you can use it with any
|
||||||
Redis version >= 1.2.0.
|
Redis version >= 1.2.0.
|
||||||
|
|
||||||
HIREDIS API
|
The library comes with multiple APIs. There is the
|
||||||
-----------
|
*synchronous API*, the *asynchronous API* and the *reply parsing API*.
|
||||||
|
|
||||||
Hiredis exports only three function calls:
|
## SYNCHRONOUS API
|
||||||
|
|
||||||
redisReply *redisConnect(int *fd, char *ip, int port);
|
To consume the synchronous API, there are only a few function calls that need to be introduced:
|
||||||
redisReply *redisCommand(int fd, char *format, ...);
|
|
||||||
void freeReplyObject(redisReply *r);
|
|
||||||
|
|
||||||
The first function is used in order to create a connection to the Redis server:
|
redisContext *redisConnect(const char *ip, int port);
|
||||||
|
void *redisCommand(redisContext *c, const char *format, ...);
|
||||||
|
void freeReplyObject(void *reply);
|
||||||
|
|
||||||
redisReply *reply;
|
### Connecting
|
||||||
int fd;
|
|
||||||
|
|
||||||
reply = redisConnect(&fd,"127.0.0.1",6379);
|
The function `redisConnect` is used to create a so-called `redisContext`. The context is where
|
||||||
|
Hiredis holds state for a connection. The `redisContext` struct has an `error` field that is
|
||||||
|
non-NULL when the connection is in an error state. It contains a string with a textual
|
||||||
|
representation of the error. After trying to connect to Redis using `redisConnect` you should
|
||||||
|
check the `error` field to see if establishing the connection was successful:
|
||||||
|
|
||||||
to test for connection errors all it is needed to do is checking if reply
|
redisContext *c = redisConnect("127.0.0.1", 6379);
|
||||||
is not NULL:
|
if (c->error != NULL) {
|
||||||
|
printf("Error: %s\n", c->error);
|
||||||
if (reply != NULL) {
|
// handle error
|
||||||
printf("Connection error: %s\n", reply->reply);
|
|
||||||
freeReplyObject(reply);
|
|
||||||
exit(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
When a reply object returns an error, the reply->type is set to the value
|
### Sending commands
|
||||||
`REDIS_REPLY_ERROR`, and reply->reply points to a C string with the description
|
|
||||||
of the error.
|
|
||||||
|
|
||||||
In the above example we don't check for reply->type as `redisConnect()` can
|
There are several ways to issue commands to Redis. The first that will be introduced is
|
||||||
only return `NULL` or a reply object that is actually an error.
|
`redisCommand`. This function takes a format similar to printf. In the simplest form,
|
||||||
|
it is used like this:
|
||||||
|
|
||||||
As you can see `redisConnect()` will just set (by reference) the `fd` variable
|
reply = redisCommand(context, "SET foo bar");
|
||||||
to the file descriptor of the open socket connected to our Redis server.
|
|
||||||
|
|
||||||
Calls to `redisCommand()` will require this file descriptor as first argument.
|
The specifier `%s` interpolates a string in the command, and uses `strlen` to
|
||||||
|
determine the length of the string:
|
||||||
|
|
||||||
SENDING COMMANDS
|
reply = redisCommand(context, "SET foo %s", value);
|
||||||
----------------
|
|
||||||
|
|
||||||
Commands are sent using a printf-alike format. In the simplest form it is
|
When you need to pass binary safe strings in a command, the `%b` specifier can be
|
||||||
like that:
|
used. Together with a pointer to the string, it requires a `size_t` length argument
|
||||||
|
of the string:
|
||||||
|
|
||||||
reply = redisCommand("SET foo bar");
|
reply = redisCommand(context, "SET foo %b", value, valuelen);
|
||||||
|
|
||||||
But you can use "%s" and "%b" format specifiers to create commands in a
|
Internally, Hiredis splits the command in different arguments and will
|
||||||
printf-alike fashion:
|
convert it to the protocol used to communicate with Redis.
|
||||||
|
One or more spaces separates arguments, so you can use the specifiers
|
||||||
reply = redisComand("SET foo %s", somevalue);
|
anywhere in an argument:
|
||||||
|
|
||||||
If your arguments are binary safe, you can use "%b" that receives the pointer
|
|
||||||
to the buffer and a size_t integer with the length of the buffer.
|
|
||||||
|
|
||||||
reply = redisCommand("SET %s %b", "foo", somevalue, somevalue_length);
|
|
||||||
|
|
||||||
Internally Hiredis will split the command in different arguments and will
|
|
||||||
convert it to the actual protocol used to communicate with Redis.
|
|
||||||
Every space will separate arguments, so you can use interpolation.
|
|
||||||
The following example is valid:
|
|
||||||
|
|
||||||
reply = redisCommand("SET key:%s %s", myid, value);
|
reply = redisCommand("SET key:%s %s", myid, value);
|
||||||
|
|
||||||
USING REPLIES
|
### Using replies
|
||||||
-------------
|
|
||||||
|
|
||||||
`redisCommand()` returns a reply object. In order to use this object you
|
The return value of `redisCommand` holds a reply when the command was
|
||||||
need to test the reply->type field, that can be one of the following types:
|
successfully executed. When the return value is `NULL`, the `error` field
|
||||||
|
in the context can be used to find out what was the cause of failure.
|
||||||
|
Once an error is returned the context cannot be reused and you should set up
|
||||||
|
a new connection.
|
||||||
|
|
||||||
|
The standard replies that `redisCommand` are of the type `redisReply`. The
|
||||||
|
`type` field in the `redisReply` should be used to test what kind of reply
|
||||||
|
was received:
|
||||||
|
|
||||||
|
* `REDIS_REPLY_STATUS`:
|
||||||
|
The command replied with a status reply. The status string can be accessed using `reply->str`.
|
||||||
|
The length of this string can be accessed using `reply->len`.
|
||||||
|
|
||||||
* `REDIS_REPLY_ERROR`:
|
* `REDIS_REPLY_ERROR`:
|
||||||
The command returned an error string, that can be read accessing to
|
The command replied with an error. The error string can be accessed identical to `REDIS_REPLY_STATUS`.
|
||||||
the reply->reply field.
|
|
||||||
|
|
||||||
* `REDIS_REPLY_STRING`:
|
|
||||||
The command returned a string, that can be read accessing to the
|
|
||||||
reply->reply field. The string is always null-terminated, but when you
|
|
||||||
need to work with binary-safe strings you can obtain the exact length
|
|
||||||
of the reply with: `sdslen(reply->reply)`.
|
|
||||||
|
|
||||||
* `REDIS_REPLY_ARRAY`:
|
|
||||||
The command returned an array of reply->elements elements.
|
|
||||||
Every element is a redisReply object, stored at redis->element[..index..]
|
|
||||||
Redis may reply with nested arrays but this is fully supported.
|
|
||||||
|
|
||||||
* `REDIS_REPLY_INTEGER`:
|
* `REDIS_REPLY_INTEGER`:
|
||||||
The command replies with an integer. It's possible to access this integer
|
The command replied with an integer. The integer value can be accessed using the
|
||||||
using the reply->integer field that is of type "long long".
|
`reply->integer` field of type `long long`.
|
||||||
|
|
||||||
* `REDIS_REPLY_NIL`:
|
* `REDIS_REPLY_NIL`:
|
||||||
The command replies with a NIL special object. There is no data to access.
|
The command replied with a **nil** object. There is no data to access.
|
||||||
|
|
||||||
FREEING REPLIES
|
* `REDIS_REPLY_STRING`:
|
||||||
---------------
|
A bulk (string) reply. The value of the reply can be accessed using `reply->str`.
|
||||||
|
The length of this string can be accessed using `reply->len`.
|
||||||
|
|
||||||
|
* `REDIS_REPLY_ARRAY`:
|
||||||
|
A multi bulk reply. The number of elements in the multi bulk reply is stored in
|
||||||
|
`reply->elements`. Every element in the multi bulk reply is a `redisReply` object as well
|
||||||
|
and can be accessed via `reply->elements[..index..]`.
|
||||||
|
Redis may reply with nested arrays but this is fully supported.
|
||||||
|
|
||||||
Replies should be freed using the `freeReplyObject()` function.
|
Replies should be freed using the `freeReplyObject()` function.
|
||||||
Note that this function will take care of freeing sub-replies objects
|
Note that this function will take care of freeing sub-replies objects
|
||||||
contained in arrays and nested arrays, so there is no need for the user to
|
contained in arrays and nested arrays, so there is no need for the user to
|
||||||
free the sub replies (it is actually harmful and will corrupt the memory).
|
free the sub replies (it is actually harmful and will corrupt the memory).
|
||||||
|
|
||||||
AUHTOR
|
## AUTHORS
|
||||||
------
|
|
||||||
|
|
||||||
Hiredis was written by Salvatore Sanfilippo (antirez at gmail) and is
|
Hiredis was written by Salvatore Sanfilippo (antirez at gmail) and
|
||||||
released under the BSD license.
|
Pieter Noordhuis (pcnoordhuis at gmail) and is released under the BSD license.
|
||||||
|
Loading…
Reference in New Issue
Block a user