MSET и MGET

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

MSET key value [key value ...] атомарно устанавливает несколько строковых ключей Redis в одной команде, а MGET key [key ...] получает значения нескольких ключей за один сетевой обход. Обе команды снижают сетевую задержку по сравнению с отдельными вызовами SET и GET, что делает их незаменимыми для пакетных операций в кэширующих слоях на базе Redis. MSETNX key value [key value ...] устанавливает несколько ключей только при условии, что ни один из них не существует, обеспечивая атомарную семантику «всё или ничего», удобную для инициализации групп связанных ключей. MGET возвращает список значений в том же порядке, в каком были запрошены ключи, возвращая nil для несуществующих ключей. При использовании Redis Cluster команды MSET и MGET требуют, чтобы все ключи принадлежали одному хэш-слоту (что достигается с помощью хэш-тегов типа {user:1000}) во избежание ошибок CROSSSLOT.

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

MSET и MGET — простейший тип 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-подобные счёты).

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

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

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

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