Caching in C++: Redis, memcached, LevelDB und andere Tools

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Caching in C++: Redis und andere beliebte Tools



In hochbelasteten C++-Anwendungen ist die Geschwindigkeit des Datenzugriffs entscheidend. Caching kann die Serverantwortzeit um das 10- bis 100-fache verkürzen und die Last auf Datenbanken und externe APIs reduzieren. In diesem Artikel betrachten wir die wichtigsten Bibliotheken für die Arbeit mit Caches in C++: vom klassischen Redis bis hin zu eingebetteten Engines wie LevelDB und RocksDB.



1. Redis und Client-Bibliotheken für C++



Redis ist der beliebteste In-Memory-Key-Value-Store, der komplexe Datenstrukturen (Listen, Mengen, Hashes) unterstützt. Für C++ gibt es zwei Haupt-Clients:



  • hiredis – eine minimalistische C-Bibliothek (offiziell), die sich leicht über Wrapper in C++ integrieren lässt.
  • redis-plus-plus – eine moderne C++17-Bibliothek mit vollständiger Abdeckung der Redis-Befehle, Unterstützung für Verbindungspools, Pipeline und Transaktionen.


Beispiel mit hiredis (synchron)

#include <hiredis/hiredis.h>#include <iostream>

int main() { redisContext *c = redisConnect("127.0.0.1", 6379); if (c == nullptr || c->err) { std::cerr << "Connection error: " << c->errstr << std::endl; return 1; }

redisReply *reply = (redisReply*)redisCommand(c, "SET key hello"); freeReplyObject(reply);

reply = (redisReply*)redisCommand(c, "GET key"); if (reply->type == REDIS_REPLY_STRING) { std::cout << "GET key: " << reply->str << std::endl; } freeReplyObject(reply); redisFree(c); return 0;}


Beispiel mit redis-plus-plus (asynchron + Pool)

#include <sw/redis++/redis++.h>#include <iostream>

int main() { sw::redis::Redis redis("tcp://127.0.0.1:6379");

// Setzen mit TTL (5 Sekunden) redis.setex("user:42", 5, "John Doe");

// Abrufen auto val = redis.get("user:42"); if (val) { std::cout << "Cached user: " << *val << std::endl; } else { std::cout << "Key expired or not found" << std::endl; } return 0;}


Vorteile von Redis: hohe Geschwindigkeit (Mikrosekunden), reichhaltiger Befehlssatz, Replikation, Clustering. Nachteile: verbraucht Arbeitsspeicher, erfordert einen separaten Server.



2. Memcached und libmemcached



Memcached ist ein einfacher verteilter Cache, der Daten nur im Arbeitsspeicher speichert. Für C++ wird die Bibliothek libmemcached (oder ihr C++-Wrapper libmemcachedutil) verwendet.



Beispiel mit libmemcached

#include <libmemcached/memcached.h>#include <iostream>#include <cstring>

int main() { memcached_st *memc = memcached_create(nullptr); memcached_server_add(memc, "127.0.0.1", 11211);

const char *key = "session_token"; const char *value = "abc123"; memcached_return_t rc = memcached_set(memc, key, strlen(key), value, strlen(value), 0, 0); // 0 - keine Kompression, 0 - TTL

if (rc == MEMCACHED_SUCCESS) { size_t value_length; uint32_t flags; char *result = memcached_get(memc, key, strlen(key), &value_length, &flags, &rc); if (rc == MEMCACHED_SUCCESS) { std::cout << "Get: " << result << std::endl; free(result); } } memcached_free(memc); return 0;}


Wann Memcached wählen: Wenn einfaches Caching ohne komplexe Datenstrukturen benötigt wird und maximale Leistung wichtig ist. Redis punktet mit Funktionalität, Memcached mit Einfachheit.



3. Eingebettete Engines: LevelDB und RocksDB



Wenn der Cache lokal sein soll und

Empfehlungen