Mise en cache en C++ : Redis, couche de données et autres outils

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Mise en cache en C++ : Redis et autres outils pour accélérer les applications



La mise en cache est l'un des mécanismes clés pour optimiser les performances des applications en C++. Dans les systèmes modernes où la vitesse d'accès aux données est critique (serveurs web, jeux, backends à forte charge), un cache bien configuré peut réduire le temps de réponse de plusieurs dizaines de fois. Dans cet article, nous allons voir comment organiser la mise en cache en C++ avec Redis et des solutions alternatives, y compris les structures de données intégrées.



Pourquoi la mise en cache en C++ ?

L'objectif principal du cache est de stocker les données fréquemment demandées dans un stockage rapide (généralement en mémoire vive), afin d'éviter des opérations coûteuses répétées : requêtes à la base de données, calculs ou appels réseau. Pour le C++, c'est particulièrement pertinent car le langage est utilisé dans les systèmes temps réel et les services à forte charge.



Redis — cache distribué pour C++

Redis est un magasin de données en mémoire souvent utilisé comme cache. Pour travailler avec Redis depuis le C++, il existe plusieurs bibliothèques matures :



  • hiredis — bibliothèque C minimaliste, client officiel de Redis. Légère, mais nécessite une gestion manuelle de la mémoire et un typage strict.
  • redis-plus-plus — wrapper C++17 moderne autour de hiredis. Prend en charge les pools de connexions, les transactions, Redis Cluster et les opérations asynchrones.
  • cpp_redis — une autre bibliothèque C++11 avec une syntaxe similaire à hiredis, mais avec une API plus pratique.


Exemple de connexion et d'utilisation de base de redis-plus-plus :



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

using namespace sw::redis;

int main() { // Connexion à Redis (serveur local, port 6379) auto redis = Redis("tcp://127.0.0.1:6379");

// Écriture dans le cache avec TTL (durée de vie de 60 secondes) redis.setex("user:123:profile", 60, "{\\"name\\":\\"Alice\\",\\"age\\":30}");

// Lecture depuis le cache auto val = redis.get("user:123:profile"); if (val) { std::cout << "Cache trouvé : " << *val << std::endl; } else { std::cout << "Cache vide, il faut charger les données depuis la BDD" << std::endl; }

return 0;}


Avantages de Redis : distribution, support de structures complexes (listes, hachages, ensembles), TTL, pub/sub. Inconvénients : nécessité d'un serveur dédié, latence réseau (bien que minime).



Caches intégrés en C++ : cache LRU et couche de données

Si vous n'avez pas besoin d'un système distribué, vous pouvez implémenter un cache directement dans l'application. L'algorithme le plus populaire est le LRU (Least Recently Used). Il évince les données qui n'ont pas été utilisées depuis le plus longtemps.



Exemple d'implémentation d'un cache LRU simple en C++17 utilisant std::unordered_map et std::list :



#include <unordered_map>#include <list>#include <stdexcept>

template<typename Key, typename Value>class LRUCache {public: LRUCache(size_t capacity) : capacity_(capacity) {}

Value get(const Key& key) { auto it = cache_.find(key); if (it == cache_.end()) { throw std::runtime_error("Key not found"); } // Déplacer l'élément au début de la liste (le plus récemment utilisé) order_.splice(order_.begin(), order_, it->second.second); return it->second.first; }

void put(const Key& key, const Value& value) { auto it = cache_.find(key); if (it != cache_.end()) { // Mettre à jour la valeur et déplacer au début it->second.first = value; order_.splice(order_.begin(), order_, it->second.second); return; } // Si le cache est plein, supprimer le dernier élément (LRU) if (cache_.size() == capacity_) { auto last = order_.back(); order_.p

Recommendations