Проверка повторного запроса через Redis иногда пропускает дубли
Чтобы не создавать двойные заказы при повторе запроса, сервис делает так:
if (redis.hasKey("idem:" + key)) {
return previousResult(key);
}
Order order = createOrder(request);
redis.opsForValue().set("idem:" + key, order.getId().toString(), Duration.ofHours(24));
Когда клиент отправляет два одинаковых запроса почти одновременно, иногда создаются два заказа. Как исправить?
- Занимать ключ атомарно командой SET NX до создания заказа
- Уменьшить TTL ключа идемпотентности до одной минуты
- Проверять наличие ключа дважды — до и после создания заказа
- Хранить ключи идемпотентности в локальной HashMap
