Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про PHP: idempotency, storage, cache, implementation

Как работает идемпотентность под капотом — где и как хранятся ключи, с чем сравнивается запрос?

Этот вопрос раскрывает техническую реализацию механизма идемпотентности на стороне сервера.

Короткий ответ

Ключи идемпотентности хранятся в быстром хранилище типа Redis или Memcached с TTL. Каждый запрос сравнивается по уникальному ключу, который клиент отправляет в заголовке. Сервер создает хеш от комбинации ключа и параметров запроса для точного сопоставления. При первом запросе результат операции кэшируется, при повторных — возвращается кэшированный ответ без выполнения операции.

Длинный ответ

Техническая реализация идемпотентности требует тщательного проектирования хранения и сравнения запросов.

Хранение ключей:

  1. Выбор хранилища

    • Redis: высокая производительность, TTL

    • Memcached: простота, автоматическое вытеснение

    • База данных: надежность, персистентность

  2. Структура ключа

    • idempotency:{user_id}:{key_hash}

    • Включает идентификатор клиента для изоляции

    • Хеш от параметров запроса для точности

Процесс сравнения:

  1. Извлечение ключа из заголовка запроса

  2. Создание fingerprint запроса:

    $requestFingerprint = md5(
        $method . ':' . 
        $path . ':' . 
        json_encode($params) . ':' . 
        $idempotencyKey
    );
  3. Поиск в хранилище по fingerprint

Полная реализация:

class IdempotencyService {
    public function handle(Request $request, callable $operation) {
        $key = $request->header('Idempotency-Key');
        $fingerprint = $this->createRequestFingerprint($request, $key);
        
        // Проверка в кэше
        if ($cached = Redis::get("idempotency:{$fingerprint}")) {
            return unserialize($cached);
        }
        
        // Выполнение операции
        $result = $operation();
        
        // Сохранение с TTL
        Redis::setex(
            "idempotency:{$fingerprint}", 
            24 * 3600, // 24 часа
            serialize($result)
        );
        
        return $result;
    }
}

Нюансы реализации:

  • TTL должен покрывать время возможного повтора

  • Учет разных пользователей

  • Очистка устаревших ключей

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    8

Навыки

  • PHP

    PHP

Ключевые слова

#idempotency

#storage

#cache

#implementation

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.