HMGET и HDEL
Тема дорожной карты · Redis
HMGET key field [field ...] извлекает значения нескольких полей хэша за один сетевой обход, возвращая nil для несуществующих полей. HDEL key field [field ...] удаляет одно или несколько полей из хэша, возвращая количество фактически удалённых полей. Эти команды незаменимы для пакетных операций над хэш-объектами Redis, позволяя избежать накладных расходов на отдельные вызовы HGET или HDEL. Когда последнее поле хэша удаляется через HDEL, Redis автоматически удаляет весь хэш-ключ для освобождения памяти. Сочетание HMGET с выборкой полей позволяет приложениям получать частичные представления больших хэш-объектов — например, извлекать только поля name и email записи пользователя без загрузки всего хэша.
Как это работает
HMGET и HDEL — два фундаментальных типа. Lists (LPUSH/RPUSH/LPOP/RPOP/LRANGE) — связные списки: быстрый push/pop с обоих концов (O(1)), медленный random access (O(N)). Hashes (HSET/HGET/HGETALL/HMSET) — мэп поле→значение внутри одного ключа: идеально для object-like данных (юзер с name, email, plan). Оба отлично подходят для queue-паттернов (BLPOP/BRPOP — блокирующие) и per-entity хранения атрибутов.
Когда применять
Lists — для очередей (LPUSH producer + BRPOP consumer — базовая work queue), таймлайнов недавней активности (LPUSH + LTRIM хранит последние N), упорядоченных логов. Hashes — когда у одной сущности много полей и вы запрашиваете по ID сущности: эффективно по памяти (один ключ на сущность) и атомарные апдейты по полю. Redis Streams (настоящий append-only лог с consumer groups) — предпочитайте list-based очередям на production-масштабе.
Типичные ошибки
Ловушки HMGET и HDEL: гигантский HGETALL на хеше с 100K полей (блокирующая команда; весь хеш сериализуется); lists как очередь сообщений с at-least-once (нужны ack — используйте Redis Streams); LRANGE 0 -1 на миллион-элементном списке (network buffer старит всех); неограниченный рост списка (max length через LPUSH ... LTRIM 0 N-1).