Listas do Redis (Parte 1)
Uma lista é uma sequência ordenada e repetível de strings. Esta lição aborda operações básicas de lista.
O que é uma Lista?
Uma lista é similar a:
- list do Python
- Array do JavaScript
- LinkedList do Java
Características da lista Redis:
- Ordenada: elementos mantêm a ordem de inserção
- Repetível: o mesmo valor pode aparecer múltiplas vezes
- Operações em ambas as extremidades: inserir e remover de ambos os lados
mylist
├─ "elemento1"
├─ "elemento2"
├─ "elemento3"
└─ "elemento4"
💡 Implementação interna: Listas Redis usam quicklist, uma combinação de lista duplamente encadeada e ziplist que equilibra memória e desempenho.
LPUSH e RPUSH: Inserir Elementos
LPUSH: Inserir pela Esquerda (Cabeça)
REDIS
# Inserir um único elemento pela esquerda
LPUSH mylist "mundo"
(integer) 1 # Retorna o tamanho da lista
# Inserir múltiplos elementos pela esquerda
LPUSH mylist "olá"
(integer) 2
# Visualizar a lista
LRANGE mylist 0 -1
1) "olá"
2) "mundo"
⚠️ Observação: Ao inserir múltiplos elementos com LPUSH, eles são inseridos da esquerda para a direita na ordem dos parâmetros.
LPUSH mylist a b c resulta em [c, b, a, ...].
RPUSH: Inserir pela Direita (Cauda)
REDIS
# Inserir pela direita
RPUSH mylist "Redis"
(integer) 3
RPUSH mylist "Tutorial"
(integer) 4
# Visualizar a lista
LRANGE mylist 0 -1
1) "olá"
2) "mundo"
3) "Redis"
4) "Tutorial"
LPUSHX e RPUSHX: Inserir Apenas se a Lista Existir
REDIS
# Inserção falha quando a lista não existe
LPUSHX naoexiste "valor"
(integer) 0
# Inserção bem-sucedida quando a lista existe
LPUSHX mylist "primeiro"
(integer) 5
RPUSHX mylist "último"
(integer) 6
LPOP e RPOP: Remover Elementos
LPOP: Remover pela Esquerda (Cabeça)
REDIS
# Visualizar lista atual
LRANGE mylist 0 -1
1) "primeiro"
2) "olá"
3) "mundo"
4) "Redis"
5) "Tutorial"
6) "último"
# Remover pela esquerda
LPOP mylist
"primeiro"
# Remover múltiplos elementos (Redis 6.2+)
LPOP mylist 2
1) "olá"
2) "mundo"
RPOP: Remover pela Direita (Cauda)
REDIS
# Remover pela direita
RPOP mylist
"último"
# Remover múltiplos elementos (Redis 6.2+)
RPOP mylist 2
1) "Tutorial"
2) "Redis"
Quando a Lista Está Vazia
REDIS
LPOP listavazia
(nil) # Retorna nil para lista vazia
LLEN: Obter Tamanho da Lista
REDIS
LPUSH mylist "a" "b" "c"
LLEN mylist
(integer) 3
# Lista não existe
LLEN naoexiste
(integer) 0
LRANGE: Obter Elementos em um Intervalo
LRANGE é o comando de consulta de lista mais comum.
Uso Básico
REDIS
LPUSH mylist "um" "dois" "três" "quatro" "cinco"
# Obter todos os elementos
LRANGE mylist 0 -1
1) "cinco"
2) "quatro"
3) "três"
4) "dois"
5) "um"
# Obter primeiros 3 elementos
LRANGE mylist 0 2
1) "cinco"
2) "quatro"
3) "três"
# Obter últimos 2 elementos
LRANGE mylist -2 -1
1) "dois"
2) "um"
# Obter elementos do índice 1 ao 3
LRANGE mylist 1 3
1) "quatro"
2) "três"
3) "dois"
Regras de Índice
| Índice | Descrição |
|---|---|
| 0 | Primeiro elemento |
| 1 | Segundo elemento |
| -1 | Último elemento |
| -2 | Penúltimo elemento |
| 0 -1 | Todos os elementos |
⚠️ Observação: O índice final em LRANGE é inclusivo.
LRANGE 0 2 retorna elementos nos índices 0, 1, 2 (3 elementos no total).
Implementando Filas e Pilhas com Listas
Fila (FIFO: Primeiro a Entrar, Primeiro a Sair)
Usando RPUSH + LPOP:
REDIS
# Produtor: enfileirar pela direita
RPUSH queue:task "task1"
RPUSH queue:task "task2"
RPUSH queue:task "task3"
# Consumidor: desenfileirar pela esquerda
LPOP queue:task
"task1"
LPOP queue:task
"task2"
Enfileirar → [task1, task2, task3] → Desenfileirar
RPUSH LPOP
Pilha (LIFO: Último a Entrar, Primeiro a Sair)
Usando LPUSH + LPOP:
REDIS
# Empilhar
LPUSH stack:data "item1"
LPUSH stack:data "item2"
LPUSH stack:data "item3"
# Desempilhar
LPOP stack:data
"item3"
LPOP stack:data
"item2"
Empilhar → [item3, item2, item1] → Desempilhar
LPUSH LPOP
💡 Auxílio de memória:
- Fila: RPUSH + LPOP (direita entra, esquerda sai)
- Pilha: LPUSH + LPOP (esquerda entra, esquerda sai)
Remoção Bloqueante: BLPOP e BRPOP
Quando a lista está vazia, BLPOP e BRPOP bloqueiam até que um elemento esteja disponível ou ocorra um timeout.
BLPOP: Remoção Bloqueante pela Esquerda
REDIS
# Cliente 1: aguardar uma tarefa na fila (máximo 10 segundos)
BLPOP queue:task 10
# Cliente 2: adicionar uma tarefa
RPUSH queue:task "nova_tarefa"
# Cliente 1 recebe:
1) "queue:task" # Nome da lista
2) "nova_tarefa" # Elemento removido
BRPOP: Remoção Bloqueante pela Direita
REDIS
BRPOP queue:task 10
Bloqueio em Múltiplas Listas
REDIS
# Aguardar em múltiplas listas, retorna a que tiver dados primeiro
BLPOP queue:high queue:low 10
💡 Caso de uso: BLPOP/BRPOP são comumente usados para implementar filas de tarefas e filas de mensagens, onde consumidores bloqueiam aguardando novas tarefas.
Casos de Uso de Lista
Caso de Uso 1: Fila de Mensagens
REDIS
# Produtor: enviar uma mensagem
RPUSH queue:email '{"to":"user@example.com","subject":"Olá"}'
# Consumidor: receber uma mensagem (espera bloqueante)
BLPOP queue:email 0
Caso de Uso 2: Lista Recente
REDIS
# Adicionar artigos mais recentes
LPUSH articles:latest "article:123"
LPUSH articles:latest "article:124"
LPUSH articles:latest "article:125"
# Obter últimos 10 artigos
LRANGE articles:latest 0 9
# Manter a lista no máximo 100 artigos
LTRIM articles:latest 0 99
Caso de Uso 3: Linha do Tempo
REDIS
# Publicar um post (adicionar à linha do tempo do usuário)
LPUSH timeline:user:1 "post:1001"
LPUSH timeline:user:1 "post:1002"
# Visualizar linha do tempo (últimos 20 posts)
LRANGE timeline:user:1 0 19
Caso de Uso 4: Log de Operações
REDIS
# Registrar ações do usuário
RPUSH log:user:1 "login em 2026-06-23 10:00:00"
RPUSH log:user:1 "visualizar article:123"
RPUSH log:user:1 "curtir article:123"
# Visualizar ações recentes
LRANGE log:user:1 -10 -1
LTRIM: Aparar a Lista
LTRIM mantém elementos dentro de um intervalo especificado e deleta todo o resto.
REDIS
LPUSH mylist "um" "dois" "três" "quatro" "cinco"
# Manter apenas os primeiros 3 elementos
LTRIM mylist 0 2
OK
LRANGE mylist 0 -1
1) "cinco"
2) "quatro"
3) "três"
Caso de Uso: Manter uma Lista de Tamanho Fixo
REDIS
# Adicionar um novo artigo e manter no máximo 100
LPUSH articles:latest "article:novo"
LTRIM articles:latest 0 99
💡 Dica: LPUSH + LTRIM juntos mantêm uma lista limitada dos itens mais recentes.
❓ Perguntas Frequentes
P Qual é o número máximo de elementos em uma lista?
R Até 2^32 - 1 (cerca de 4.2 bilhões), mas praticamente limitado pela memória.
P Quão rápidos são LPUSH e RPOP?
R Complexidade de tempo O(1) — muito rápidos. Operações na cabeça e cauda são em tempo constante.
P Quão rápido é LRANGE?
R O(N), onde N é o número de elementos retornados. Obter um intervalo grande é mais lento.
P BLPOP bloqueia indefinidamente?
R Não. Defina um timeout; após o timeout, ele retorna nil. Um timeout de 0 significa esperar para sempre.
P E quanto a inserir no meio de uma lista?
R Use LINSERT, mas tem desempenho O(N). É recomendado operar apenas na cabeça e cauda.
📖 Resumo
- Lista é uma sequência ordenada e repetível de strings
- LPUSH/RPUSH inserem pela esquerda e direita, LPOP/RPOP removem pela esquerda e direita
- LRANGE obtém elementos em um intervalo, LLEN obtém o tamanho
- RPUSH + LPOP = Fila (FIFO)
- LPUSH + LPOP = Pilha (LIFO)
- BLPOP/BRPOP remoção bloqueante, usada para filas de tarefas
- Aplicações de lista: filas de mensagens, listas recentes, linhas do tempo, logs de operações
- LTRIM aparar a lista para manter um tamanho fixo
📝 Atividades
- Implementação de fila: Use RPUSH e LPOP para implementar uma fila de tarefas, simulando um produtor e consumidor
- Implementação de pilha: Use LPUSH e LPOP para implementar uma pilha, simulando empilhar e desempilhar
- Lista recente: Implemente uma lista de artigos recentes, adicionando artigos e mantendo no máximo 10
- Espera bloqueante: Use BLPOP para implementar uma fila de tarefas bloqueante (precisa de dois terminais)
Próxima Lição
Na próxima lição, nós aprenderemos sobre Listas do Redis (Parte 2), abordando consulta, modificação e operações avançadas de lista.



