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:

Características da lista Redis:

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

📝 Atividades

  1. Implementação de fila: Use RPUSH e LPOP para implementar uma fila de tarefas, simulando um produtor e consumidor
  2. Implementação de pilha: Use LPUSH e LPOP para implementar uma pilha, simulando empilhar e desempilhar
  3. Lista recente: Implemente uma lista de artigos recentes, adicionando artigos e mantendo no máximo 10
  4. 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.

100%