Hiredis-vip — клиентская библиотека на языке C для работы с базой данных Redis.
Hiredis-vip поддерживает кластер Redis.
Библиотека Hiredis-vip полностью включена и основана на Hiredis.
redisClusterContext *redisClusterContextInit(void);
void redisClusterFree(redisClusterContext *cc);
int redisClusterSetOptionAddNode(redisClusterContext *cc, const char *addr);
int redisClusterSetOptionAddNodes(redisClusterContext *cc, const char *addrs);
int redisClusterSetOptionConnectBlock(redisClusterContext *cc);
int redisClusterSetOptionConnectNonBlock(redisClusterContext *cc);
int redisClusterSetOptionParseSlaves(redisClusterContext *cc);
int redisClusterSetOptionParseOpenSlots(redisClusterContext *cc);
int redisClusterSetOptionRouteUseSlots(redisClusterContext *cc);
int redisClusterSetOptionConnectTimeout(redisClusterContext *cc, const struct timeval tv);
int redisClusterSetOptionTimeout(redisClusterContext *cc, const struct timeval tv);
int redisClusterSetOptionMaxRedirect(redisClusterContext *cc, int max_redirect_count);
int redisClusterConnect2(redisClusterContext *cc);
void *redisClusterFormattedCommand(redisClusterContext *cc, char *cmd, int len);
void *redisClustervCommand(redisClusterContext *cc, const char *format, va_list ap);
void *redisClusterCommand(redisClusterContext *cc, const char *format, ...);
void *redisClusterCommandArgv(redisClusterContext *cc, int argc, const char **argv, const size_t *argvlen);
int redisClusterAppendFormattedCommand(redisClusterContext *cc, char *cmd, int len);
int redisClustervAppendCommand(redisClusterContext *cc, const char *format, va_list ap);
int redisClusterAppendCommand(redisClusterContext *cc, const char *format, ...);
int redisClusterAppendCommandArgv(redisClusterContext *cc, int argc, const char **argv, const size_t *argvlen);
int redisClusterGetReply(redisClusterContext *cc, void **reply);
void redisClusterReset(redisClusterContext *cc);
redisContext *ctx_get_by_node(redisClusterContext *cc, struct cluster_node *node);
redisClusterAsyncContext *redisClusterAsyncConnect(const char *addrs, int flags);
int redisClusterAsyncSetConnectCallback(redisClusterAsyncContext *acc, redisConnectCallback *fn);
int redisClusterAsyncSetDisconnectCallback(redisClusterAsyncContext *acc, redisDisconnectCallback *fn);
int redisClusterAsyncFormattedCommand(redisClusterAsyncContext *acc, redisClusterCallbackFn *fn, void *privdata, char *cmd, int len);
int redisClustervAsyncCommand(redisClusterAsyncContext *acc, redisClusterCallbackFn *fn, void *privdata, const char *format, va_list ap);
int redisClusterAsyncCommand(redisClusterAsyncContext *acc, redisClusterCallbackFn *fn, void *privdata, const char *format, ...);
int redisClusterAsyncCommandArgv(redisClusterAsyncContext *acc, redisClusterCallbackFn *fn, void *privdata, int argc, const char **argv, const size_t *argvlen);
void redisClusterAsyncDisconnect(redisClusterAsyncContext *acc);
void redisClusterAsyncFree(redisClusterAsyncContext *acc);
redisAsyncContext *actx_get_by_node(redisClusterAsyncContext *acc, cluster_node *node);
redisClusterConnect(const char *addrs, int flags);
redisClusterConnectWithTimeout(const char *addrs, const struct timeval tv, int flags);
redisClusterConnectNonBlock(const char *addrs, int flags);
void redisClusterFree(redisClusterContext *cc);
void redisClusterSetMaxRedirect(redisClusterContext *cc, int max_redirect_count);
void *redisClusterFormattedCommand(redisClusterContext *cc, char *cmd, int len);
void *redisClustervCommand(redisClusterContext *cc, const
``` **redisClusterAsyncSetDisconnectCallback(redisClusterAsyncContext *acc, redisDisconnectCallback *fn);**
### Отправка команд и их обратных вызовов
В контексте асинхронного кластера команды автоматически ставятся в очередь из-за природы цикла событий. Поэтому, в отличие от синхронного API кластера, существует только один способ отправки команд.
Поскольку команды отправляются в кластер Redis асинхронно, для выдачи команды требуется функция обратного вызова, которая вызывается при получении ответа. Обратные вызовы ответа должны иметь следующий прототип:
```c
void(redisClusterAsyncContext *acc, void *reply, void *privdata);
Аргумент privdata
можно использовать для передачи произвольных данных в обратный вызов из точки, где команда изначально ставится в очередь на выполнение.
Функции, которые можно использовать для выполнения команд в асинхронном контексте:
int redisClusterAsyncCommand(
redisClusterAsyncContext *acc,
redisClusterCallbackFn *fn,
void *privdata, const char *format, ...);
Эта функция работает аналогично своим блокирующим аналогам. Возвращаемое значение — REDIS_OK
, когда команда была успешно добавлена в выходной буфер, и REDIS_ERR
в противном случае. Пример: когда соединение разрывается по запросу пользователя, никакие новые команды не могут быть добавлены в выходной буфер и при вызовах семейства функций redisClusterAsyncCommand
возвращается REDIS_ERR
.
Если ответ для команды с нулевым обратным вызовом прочитан, он немедленно освобождается. Когда обратный вызов для команды не равен нулю, память освобождается сразу после обратного вызова: ответ действителен только на время обратного вызова.
Все ожидающие обратные вызовы вызываются с нулевым ответом, когда контекст столкнулся с ошибкой.
Асинхронное соединение кластера может быть разорвано с помощью:
void redisClusterAsyncDisconnect(redisClusterAsyncContext *acc);
Когда эта функция вызывается, соединение не разрывается немедленно. Вместо этого новые команды больше не принимаются, а соединение разрывается только тогда, когда все ожидающие команды были записаны в сокет, их соответствующие ответы были прочитаны и их соответствующие обратные вызовы были выполнены. После этого выполняется обратный вызов отключения со статусом REDIS_OK
и объект контекста освобождается.
Существует несколько хуков, которые необходимо установить на объект контекста кластера после его создания. См. каталог adapters/
для привязок к ae и libevent.
Hiredis-vip поддерживался и использовался в vipshop (https://github.com/vipshop).
Часть клиентской библиотеки redis в hiredis-vip такая же, как у hiredis (https://github.com/redis/hiredis).
Часть клиентской библиотеки кластера redis в hiredis-vip написана deep (https://github.com/deep011).
Hiredis-vip выпущен под лицензией BSD.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )