> Как обеспечить атомарность операций при увеличении счетчика запросов в Redis (JavaScript)
Уровень: senior · Роль: backend · Язык: JavaScript · Категория: Технические вопросы
Компании: QueenInteractiveGamesLtd
Стек: Node.js, Redis, JavaScript
> Пример ответа
Атомарность инкремента счётчика в Redis обеспечивается использованием встроенной команды INCR. Она выполняется на стороне сервера за один шаг без блокировок и не требует дополнительных проверок. В Node.js с библиотекой ioredis это выглядит так:
JAVASCRIPTconst Redis = require('ioredis');const redis = new Redis();async function incrementCounter(key) {const newValue = await redis.incr(key);return newValue;}
Если нужно увеличить на значение больше 1, используйте INCRBY. Для сложных операций (например, чтение-модификация-запись с условиями) применяйте Lua-скрипты через EVAL - они выполняются атомарно. Пример скрипта для инкремента с проверкой лимита:
JAVASCRIPTconst script = `local current = redis.call('GET', KEYS[1])if current and tonumber(current) >= tonumber(ARGV[1]) thenreturn redis.error_reply('Limit exceeded')endreturn redis.call('INCR', KEYS[1])`;const result = await redis.eval(script, 1, 'counter', '100');
Используйте MULTI/EXEC (транзакции) только если атомарность не критична - они не гарантируют изоляции от других команд. Для строгой атомарности предпочтительны INCR или Lua.
> Похожие задачи по JavaScript
Как устроен garbage collector
Для чего нужен setImmediate() в JavaScript и как он работает
Как происходит шифрование в HTTPS
Что такое HTTPS и как он работает
> Похожие задачи по backend
Какие вопросы возникают при работе с миграциями в Prisma
Как строить индексы в PostgreSQL
Почему плохо вводить индексы для каждой колонки
Какой тип поля использовать для хранения словаря в базе данных: JSON или JSONB?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью