Caching in C++: Redis, Memcached und eingebaute Lösungen: Ein vollständiger Leitfaden

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

Einleitung: Warum Caching in C++ notwendig ist und wie es Anwendungen beschleunigt

\n\n

In der modernen C++-Entwicklung ist die Leistung ein kritischer Faktor. Jede unnötige Datenbankabfrage, jede wiederholte Berechnung einer komplexen Funktion oder ein Lesevorgang von der Festplatte sind verlorene Millisekunden, die sich im Maßstab eines hochbelasteten Dienstes in Sekunden Ausfallzeit verwandeln. Caching löst dieses Problem, indem es die Ergebnisse teurer Operationen in einem schnell zugänglichen Speicher speichert.

\n\n

In diesem Artikel betrachten wir drei Hauptansätze für Caching in C++: externe Systeme (Redis, Memcached) und eingebaute Lösungen (std::unordered_map, LRU-Cache). Sie erfahren, wann Sie welches Werkzeug wählen, wie Sie den Cache richtig konfigurieren und welche Fallstricke auf Sie warten.

\n\n

1. Externe Caching-Systeme: Redis und Memcached

\n\n

1.1 Redis: Leistungsstarker In-Memory-Store mit Unterstützung für Datenstrukturen

\n\n

Redis ist nicht nur ein Cache, sondern ein vollwertiger Datenstruktur-Server, der im Arbeitsspeicher arbeitet. Er unterstützt Strings, Listen, Mengen, Hash-Tabellen und sogar Warteschlangen. Für C++ gibt es mehrere Client-Bibliotheken, die beliebtesten sind hiredis (in C) und redis-plus-plus (in C++).

\n\n

Beispiel für die Verbindung und Nutzung von Redis über redis-plus-plus:

\n\n
#include <sw/redis++/redis++.h>\n#include <iostream>\n\nint main() {\n    // Verbindung zu Redis auf dem lokalen Host\n    sw::redis::Redis redis("tcp://127.0.0.1:6379");\n\n    // Wert in den Cache schreiben\n    redis.set("user:1001", "{\\"name\\":\\"Alice\\",\\"age\\":30}");\n\n    // Wert lesen\n    auto val = redis.get("user:1001");\n    if (val) {\n        std::cout << "Cache-Daten: " << *val << std::endl;\n    }\n\n    // TTL (Lebensdauer) setzen — 60 Sekunden\n    redis.expire("user:1001", 60);\n\n    return 0;\n}\n
\n\n

Vorteile von Redis:

\n
    \n
  • Unterstützung komplexer Datenstrukturen (Listen, Hashes, Mengen)
  • \n
  • Integrierte Mechanismen für Replikation und Persistenz
  • \n
  • Unterstützung von Transaktionen und Lua-Skripten
  • \n
  • Möglichkeit der Nutzung als Pub/Sub-Nachrichtenbroker
  • \n
\n\n

Nachteile von Redis:

\n
    \n
  • Erfordert einen separaten Server (zusätzliche Infrastruktur)
  • \n
  • Verbraucht aufgrund der Metadaten der Strukturen mehr Speicher als Memcached
  • \n
  • Nicht geeignet für sehr große Datenmengen (RAM-Begrenzung)
  • \n
\n\n

1.2 Memcached: Leichter und schneller verteilter Cache

\n\n

Memcached ist ein einfacheres System, das ausschließlich für das Caching von Schlüssel-Wert-Paaren ausgelegt ist. Es ist ideal für die Speicherung kleiner Objekte (bis zu 1 MB). Für C++ wird die Bibliothek libmemcached verwendet.

\n\n

Beispiel für die Arbeit mit Memcached in C++:

\n\n
#include <libmemcached/memcached.h>\n#include <iostream>\n#include <cstring>\n\nint main() {\n    memcached_server_st *servers;\n    memcached_st *memc;\n    memcached_return rc;\n\n    memc = memcached_create(nullptr);\n    servers = memcached_server_list_append(nullptr, "127.0.0.1", 11211, &rc);\n    rc = memcached_server_push(memc, servers);\n\n    // Schreiben in den Cache mit TTL 300 Sekunden\n    const char *key = "session_token_abc123";\n    const char *value = "valid";\n    rc = memcached_set(memc, key, strlen(key), value, strlen(value), 300, 0);\n\n    // Lesen aus dem Cache\n    size_t value_length;\n    uint32_t flags;\n    char *result = memcached_get(memc, key, strlen(key), &value_length, &flags, &rc);\n    if (result) {\n        std::cout << "Cache-Wert: " << result << std::endl;\n        free(result);\n    }\n\n    memcached_free(memc);\n    return 0;\n}\n
\n\n

Vorteile von Memcached:

\n
    \n
  • Maximale Leistung bei einfachen Get/Set-Operationen
  • \n
  • Minimaler Speicherverbrauch für Metadaten
  • \n <

Blogs

Buchempfehlungen