> Как обеспечить атомарность операций при увеличении счетчика запросов в Redis (JavaScript)

Уровень: senior · Роль: backend · Язык: JavaScript · Категория: Технические вопросы

Компании: QueenInteractiveGamesLtd

Стек: Node.js, Redis, JavaScript

> Пример ответа

Атомарность инкремента счётчика в Redis обеспечивается использованием встроенной команды INCR. Она выполняется на стороне сервера за один шаг без блокировок и не требует дополнительных проверок. В Node.js с библиотекой ioredis это выглядит так:

JAVASCRIPT
const Redis = require('ioredis');
const redis = new Redis();
async function incrementCounter(key) {
const newValue = await redis.incr(key);
return newValue;
}

Если нужно увеличить на значение больше 1, используйте INCRBY. Для сложных операций (например, чтение-модификация-запись с условиями) применяйте Lua-скрипты через EVAL - они выполняются атомарно. Пример скрипта для инкремента с проверкой лимита:

JAVASCRIPT
const script = `
local current = redis.call('GET', KEYS[1])
if current and tonumber(current) >= tonumber(ARGV[1]) then
return redis.error_reply('Limit exceeded')
end
return redis.call('INCR', KEYS[1])
`;
const result = await redis.eval(script, 1, 'counter', '100');

Используйте MULTI/EXEC (транзакции) только если атомарность не критична - они не гарантируют изоляции от других команд. Для строгой атомарности предпочтительны INCR или Lua.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью