Я хочу получить как можно больше от Redis + Hiredis + libevent.Async Redis pooling using libevent
Я использую следующий код (без каких-либо проверок должны быть короткими)
#include <stdlib.h>
#include <event2/event.h>
#include <event2/http.h>
#include <event2/buffer.h>
#include <hiredis/hiredis.h>
#include <hiredis/async.h>
#include <hiredis/adapters/libevent.h>
typedef struct reqData {
struct evhttp_request* req;
struct evbuffer* buf;
} reqData;
struct event_base* base;
redisAsyncContext* c;
void get_cb(redisAsyncContext* context, void* r, void* data) {
redisReply* reply = r;
struct reqData* rd = data;
evbuffer_add_printf(rd->buf, "%s", reply->str);
evhttp_send_reply(rd->req, HTTP_OK, NULL, rd->buf);
evbuffer_free(rd->buf);
redisAsyncDisconnect(context);
}
void cb(struct evhttp_request* req, void* args) {
struct evbuffer* buf;
buf = evbuffer_new();
reqData* rd = malloc(sizeof(reqData));
rd->req = req;
rd->buf = buf;
c = redisAsyncConnect("0.0.0.0", 6380);
redisLibeventAttach(c, base);
redisAsyncCommand(c, get_cb, rd, "GET name");
}
int main(int argc, char** argv) {
struct evhttp* http;
struct evhttp_bound_socket* sock;
base = event_base_new();
http = evhttp_new(base);
sock = evhttp_bind_socket_with_handle(http, "0.0.0.0", 8080);
evhttp_set_gencb(http, cb, NULL);
event_base_dispatch(base);
evhttp_free(http);
event_base_free(base);
return 0;
}
Для компиляции используйте gcc -o main -levent -lhiredis main.c
предполагая Libevent, Redis и hiredis в системе.
Мне любопытно, когда мне нужно сделать redisAsyncConnect
? В main()
один раз или (как показано на примере) в каждом обратном вызове. Есть ли что-то, что я могу сделать для повышения производительности?
Я получаю около 6000-7000 req/s. Используя ab
, чтобы сравнить это, материал усложняется при попытке больших чисел (например, 10k reqs) - он не может завершить тесты и замораживать. Выполнение одного и того же результата, но с блокировкой результатов 5000-6000 req/s.
Я расширил максимальный файл, открытый limit -n 10000
. Я использую Mac OS X Lion.
Не могу представить лучшего и более ценного ответа. Многие, большое спасибо Дидье! Также вы могли бы рассказать мне больше о дальнейшей оптимизации с помощью сокета домена? Или ссылку на некоторые ресурсы? –
Я обновил свой предыдущий ответ соответственно. –
Спасибо! Не могу дождаться, чтобы проверить тесты. –