Mise en cache en C++ : Redis et autres outils
La mise en cache est l'une des techniques clés pour optimiser les performances des applications en C++. Elle permet de réduire le temps d'accès aux données, de diminuer la charge sur les bases de données et les services externes. Dans cet article, nous examinerons les principales bibliothèques et outils pour implémenter la mise en cache en C++ : des solutions industrielles basées sur Redis et Memcached aux implémentations légères intégrées.
1. Redis et ses clients C++
Redis est un stockage de données en mémoire de type « clé-valeur » hautes performances, souvent utilisé comme cache. Pour travailler avec Redis depuis C++, il existe deux bibliothèques principales :
1.1. hiredis
hiredis est une bibliothèque C minimaliste officiellement supportée par Redis. Elle fournit une API synchrone et asynchrone.
Installation :
# Ubuntu/Debiansudo apt install libhiredis-dev
# macOSbrew install hiredis
# Compilation depuis les sourcesgit clone https://github.com/redis/hiredis.gitcd hiredis && make && sudo make installExemple d'utilisation (mode synchrone) :
#include <hiredis/hiredis.h>#include <iostream>
int main() { redisContext *c = redisConnect("127.0.0.1", 6379); if (c == nullptr || c->err) { std::cerr << "Erreur de connexion : " << c->errstr << std::endl; return 1; }
// Définition d'une valeur redisReply *reply = (redisReply*)redisCommand(c, "SET key1 value1"); freeReplyObject(reply);
// Récupération de la valeur reply = (redisReply*)redisCommand(c, "GET key1"); if (reply->type == REDIS_REPLY_STRING) { std::cout << "Valeur : " << reply->str << std::endl; } freeReplyObject(reply);
redisFree(c); return 0;}1.2. redis-plus-plus
redis-plus-plus est une enveloppe C++17 moderne autour de hiredis avec une interface pratique, le support du pool de connexions, des transactions et de pub/sub.
Installation :
git clone https://github.com/sewenew/redis-plus-plus.gitcd redis-plus-plusmkdir build && cd buildcmake -DREDIS_PLUS_PLUS_CXX_STANDARD=17 ..make && sudo make installExemple :
#include <sw/redis++/redis++.h>#include <iostream>
int main() { sw::redis::Redis redis("tcp://127.0.0.1:6379");
// Définition avec TTL (durée de vie de 60 secondes) redis.setex("session:user1", 60, "active");
// Récupération auto val = redis.get("session:user1"); if (val) { std::cout << "Session : " << *val << std::endl; }
// Vérification d'existence bool exists = redis.exists("session:user1"); std::cout << "Existe : " << std::boolalpha << exists << std::endl;
return 0;}2. Memcached et libmemcached
Memcached est un autre stockage en mémoire populaire, optimisé pour la mise en cache de petits objets. La bibliothèque C++ principale est libmemcached.
Installation :
sudo apt install libmemcached-dev
# Compilation depuis les sourcesgit clone https://github.com/awesomized/libmemcached.gitcd libmemcached && ./configure && make && sudo make installExemple :
#include <libmemcached/memcached.h>#include <iostream>#include <cstring>
int main() { memcached_st *memc = memcached_create(nullptr); memcached_server_st *servers = memcached_server_list_append(nullptr, "127.0.0.1", 11211, nullptr); memcached_server_push(memc, servers); memcached_server_list_free(servers);
// Écriture const char *key = "cache_key"; const char *value = "cached_value"; memcached_return_t rc = memcached_set(memc, k