LPUSH и RPUSH

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

LPUSH key element [element ...] добавляет один или несколько элементов в начало (левую сторону) списка Redis, а RPUSH key element [element ...] добавляет элементы в конец (правую сторону). Обе команды возвращают длину списка после добавления и автоматически создают ключ списка если он не существует. LPUSHX и RPUSHX — варианты, добавляющие элементы только при существующем ключе, предотвращая случайное создание списка. Выбор между LPUSH и RPUSH зависит от нужной семантики очереди: использование RPUSH для добавления и LPOP для извлечения реализует очередь FIFO, а LPUSH/LPOP — стек LIFO. Списки Redis, построенные с помощью LPUSH/RPUSH, являются основой очередей задач в таких фреймворках как Sidekiq (Ruby) и Celery (Python), хранящих полезные нагрузки задач как сериализованные строки.

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

LPUSH и RPUSH — два фундаментальных типа. 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-масштабе.

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

Ловушки LPUSH и RPUSH: гигантский HGETALL на хеше с 100K полей (блокирующая команда; весь хеш сериализуется); lists как очередь сообщений с at-least-once (нужны ack — используйте Redis Streams); LRANGE 0 -1 на миллион-элементном списке (network buffer старит всех); неограниченный рост списка (max length через LPUSH ... LTRIM 0 N-1).

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

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