Кэширование в C++: Redis и другие инструменты
Кэширование — одна из ключевых техник оптимизации производительности приложений на C++. Оно позволяет сократить время доступа к данным, снизить нагрузку на базы данных и внешние сервисы. В этой статье мы рассмотрим основные библиотеки и инструменты для реализации кэширования в C++: от промышленных решений на базе Redis и Memcached до легковесных встроенных реализаций.
1. Redis и его C++ клиенты
Redis — это высокопроизводительное in-memory хранилище данных типа «ключ-значение», которое часто используется как кэш. Для работы с Redis из C++ существуют две основные библиотеки:
1.1. hiredis
hiredis — минималистичная C-библиотека, официально поддерживаемая Redis. Она предоставляет синхронный и асинхронный API.
Установка:
# Ubuntu/Debian
sudo apt install libhiredis-dev
# macOS
brew install hiredis
# Сборка из исходников
git clone https://github.com/redis/hiredis.git
cd hiredis && make && sudo make install
Пример использования (синхронный режим):
#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 key1 value1");
freeReplyObject(reply);
// Получение значения
reply = (redisReply*)redisCommand(c, "GET key1");
if (reply->type == REDIS_REPLY_STRING) {
std::cout << "Value: " << reply->str << std::endl;
}
freeReplyObject(reply);
redisFree(c);
return 0;
}
1.2. redis-plus-plus
redis-plus-plus — современная C++17 обёртка над hiredis с удобным интерфейсом, поддержкой пула соединений, транзакций и pub/sub.
Установка:
git clone https://github.com/sewenew/redis-plus-plus.git
cd redis-plus-plus
mkdir build && cd build
cmake -DREDIS_PLUS_PLUS_CXX_STANDARD=17 ..
make && sudo make install
Пример:
#include <sw/redis++/redis++.h>
#include <iostream>
int main() {
sw::redis::Redis redis("tcp://127.0.0.1:6379");
// Установка с TTL (время жизни 60 секунд)
redis.setex("session:user1", 60, "active");
// Получение
auto val = redis.get("session:user1");
if (val) {
std::cout << "Session: " << *val << std::endl;
}
// Проверка существования
bool exists = redis.exists("session:user1");
std::cout << "Exists: " << std::boolalpha << exists << std::endl;
return 0;
}
2. Memcached и libmemcached
Memcached — ещё одно популярное in-memory хранилище, оптимизированное для кэширования мелких объектов. Основная C++ библиотека — libmemcached.
Установка:
sudo apt install libmemcached-dev
# Сборка из исходников
git clone https://github.com/awesomized/libmemcached.git
cd libmemcached && ./configure && make && sudo make install
Пример:
#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);
// Запись
const char *key = "cache_key";
const char *value = "cached_value";
memcached_return_t rc = memcached_set(memc, key, strlen(key), value, strlen(value), 0, 0);
if (rc == MEMCACHED_SUCCESS) {
std::cout << "Set successful" << std::endl;
}
// Чтение
size_t value_length;
uint32_t flags;
char *result = memcached_get(memc, key, strlen(key), &value_length, &