Ich möchte so viel wie möglich von Redis + Hiredis + Libevent bekommen.Async Redis Pooling mit Libevent
Ich verwende folgenden Code (ohne Kontrollen kurz zu sein) in System
#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;
}
zu kompilieren, verwenden gcc -o main -levent -lhiredis main.c
vorausgesetzt libevent, redis und hiredis.
Ich bin neugierig, wenn ich redisAsyncConnect
tun muss? In main()
einmal oder (wie zum Beispiel) in jedem Callback. Kann ich etwas tun, um die Leistung zu steigern?
Ich bekomme über 6000-7000 req/s. Mit ab
, um dies zu benchmarken, kompliziert Sachen beim Versuch große Zahlen (z. B. 10k Reqs) - es kann Benchmark nicht abgeschlossen und friert. Die gleiche Sache machend, aber in blockierender Weise sind die Resultate 5000-6000 req/s.
Ich habe Max Datei geöffnet von limit -n 10000
erweitert. Ich benutze Mac OS X Lion.
Kann mir keine bessere und wertvollere Antwort vorstellen. Vielen, vielen Dank Didier! Kannst du mir auch mehr über weitere Optimierung mit Domain Socket erzählen? Oder verlinke mich mit einigen Ressourcen? –
Ich habe meine vorherige Antwort entsprechend aktualisiert. –
Danke! Ich kann es kaum erwarten, die Benchmarks zu überprüfen. –