SETNX и GETSET

Тема дорожной карты · Redis

GETSET key value атомарно устанавливает ключ Redis в новое значение и возвращает предыдущее значение в одной команде, что удобно для операций обмена и сброса счётчиков с сохранением их предыдущего состояния. SETNX key value (Set if Not eXists — установить, если не существует) устанавливает ключ только при его отсутствии и возвращает 1 в случае успеха или 0 если ключ уже существовал, что является основой паттернов распределённых блокировок до появления SET ... NX EX. В современном Redis (2.6.12+) предпочтительным подходом является SET key value NX EX seconds, который объединяет SETNX с атомарным TTL для предотвращения утечек блокировки при падении клиента. GETSET объявлен устаревшим в Redis 6.2 в пользу GETDEL и SET ... GET, которые предоставляют более понятную семантику. Понимание GETSET и SETNX важно при работе с унаследованными кодовыми базами Redis и для реализации паттернов оптимистичного параллелизма.

Как это работает

SETNX и GETSET — простейший тип Redis: бинарно-безопасная последовательность байт до 512MB. Команды: SET, GET, APPEND, STRLEN, GETRANGE, INCR/DECR (атомарные счётчики на string-encoded integer), SETEX (set с TTL), SETNX (set если нет, основа distributed lock до Redlock). TTL через EXPIRE / PEXPIRE; авто-удаление при истечении.

Когда применять

Strings — рабочая лошадка: кеш JSON-ответов, атомарные счётчики (INCR page_views:2026-05-15), простые feature flags, session ID, rate-limit бакеты. SET ... EX ... NX — "set если нет с TTL", основа безопасных single-instance локов. SETBIT/GETBIT — bitmap-трюки (per-user feature flags, bloom-filter-подобные счёты).

Типичные ошибки

Ловушки SETNX и GETSET: хранение 50MB JSON-блобов как Redis-strings (network + RAM bloat — храните ID + lookup отдельно); ad-hoc TTL дрейфуют (используйте константу); SETNX для локов в Redis Cluster (используйте Redlock или single-master); APPEND многократно к гигантской строке (O(N²) память). Значения маленькие; Redis это RAM, не диск.

Связанные понятия

Полезные ресурсы