1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/vipshop-hiredis-vip

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Hiredis-vip — клиентская библиотека на языке C для работы с базой данных Redis.

Hiredis-vip поддерживает кластер Redis.

Библиотека Hiredis-vip полностью включена и основана на Hiredis.

Поддержка кластера

Особенности:

  • Поддержка кластера Redis: подключение к кластеру Redis и выполнение команд.
  • Поддержка многоключевых команд: поддержка MSET, MGET и DEL.
  • Поддержка конвейеризации: поддержка конвейера Redis, который может содержать многоключевые команды, как указано выше.
  • Асинхронный API: пользователь может выполнять команды в асинхронном режиме.

API кластера:

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);

API кластера (старый API, версия <= 0.3.0):

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 и объект контекста освобождается.

Подключение к библиотеке событий X

Существует несколько хуков, которые необходимо установить на объект контекста кластера после его создания. См. каталог 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Поддержка кластера Redis. Используется и поддерживается в компании Vipshop. Развернуть Свернуть
BSD-3-Clause
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/vipshop-hiredis-vip.git
git@api.gitlife.ru:oschina-mirror/vipshop-hiredis-vip.git
oschina-mirror
vipshop-hiredis-vip
vipshop-hiredis-vip
master