Кэширование в C++: Redis, Memcached и встроенные решения

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Кэширование в 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, &                    

Рекомендаций