Tipos de Dadoss e Comandos Essenciais
O Redis oferece diversos tipos de estruturas de dados. Cada um é otimizado para cenários específicos, desde listas simples até conjuntos ordenados.
Listas (Lists)
Uma lista no Redis é uma sequência ordenada de strings. Elas são implementadas como listas encadeadas, tornando as operações de inserção e remoção nas extremidades muito rápidas.
# Adicionar elementos no início e no final
LPUSH nome_lista "elemento1" "elemento2"
RPUSH nome_lista "elemento3"
# Remover e retornar o primeiro elemento
LPOP nome_lista
# Remover e retornar o último elemento
RPOP nome_lista
# Mover um elemento entre listas
RPOPLPUSH lista_origem lista_destino
# Recuperar um intervalo de elementos (0 a -1 é a lista toda)
LRANGE nome_lista 0 -1
# Verificar o tamanho da lista
LLEN nome_lista
# Acessar um elemento pelo índice
LINDEX nome_lista 0
Hashes
Hashes são coleções de pares campo-valor. São ideais para representar objetos com múltiplas propriedades.
# Definir um valor para um campo
HSET objeto:user:1 nome "João" sobrenome "Silva"
# Obter o valor de um campo específico
HGET objeto:user:1 nome
# Listar todos os campos de um hash
HKEYS objeto:user:1
# Listar todos os valores de um hash
HVALS objeto:user:1
# Incrementar o valor numérico de um campo
HINCRBY objeto:user:1 visitas 1
Conjuntos (Sets)
Conjuntos são coleções não-ordenadas de strings únicas. Oferecem operações eficientes de união, interseção e diferença.
# Adicionar membros a um conjunto (ignora duplicatas)
SADD conjunto_tecnologias "Java" "Python" "Go"
# Listar todos os membros
SMEMBERS conjunto_tecnologias
# Verificar se um membro pertence ao conjunto
SISMEMBER conjunto_tecnologias "Rust"
# Contar o número de membros
SCARD conjunto_tecnologias
# Remover um ou mais membros
SREM conjunto_tecnologias "Go"
Conjuntos Ordenados (Sorted Sets)
Semelhante aos conjuntos, mas cada membro é asociado a um score. Isso mantém a coleção sempre ordenada por essa pontuação.
# Adicionar elementos com seus respectivos scores
ZADD placar_jogo 100 "JogadorA" 95 "JogadorB" 110 "JogadorC"
# Obter elementos por posição (0 é o primeiro)
ZRANGE placar_jogo 0 -1 WITHSCORES
# Obter elementos dentro de uma faixa de scores
ZRANGEBYSCORE placar_jogo 95 105
# Contar elementos em uma faixa de scores
ZCOUNT placar_jogo 100 200
# Obter a posição (rank) de um elemento
ZRANK placar_jogo "JogadorB"
# Remover um elemento
ZREM placar_jogo "JogadorB"
Strings
Strings são o tipo mais básico, capaz de armazenar strings, números ou até mesmo dados binários como imagens.
# Operações básicas de SET e GET
SET chave_simples "valor_exemplo"
GET chave_simples
# Definir um valor com tempo de expiração (em segundos)
SETEX chave_temporaria 3600 "desaparece em 1 hora"
# Definir um valor somente se a chave não existir (atômico)
SETNX chave_se_nao_existir "valor_novo"
# Operações em lote
MSET chave1 "valor1" chave2 "valor2"
MGET chave1 chave2
# Verificar o comprimento de uma string
STRLEN chave_simples
# Incrementar/Decrementar valores numéricos atomically
INCR contador_visitas
DECR estoque_produto
INCRBY contador_visitas 5
Pub/Sub (Publicar/Inscrever)
Um sistema de mensagens leve onde os clientes (publicadores) enviam mensagens para canais sem conhecimento dos destinatários. Outros clientes (assinantes) se inscrevem em canais específicos para receber mensagens.
# Um cliente se inscreve em um canal (bloqueia e espera mensagens)
SUBSCRIBE canal_noticias
# Outro cliente publica uma mensagem no mesmo canal
PUBLISH canal_noticias "Nova versão lançada!"
Integração com Spring Boot
Configurar uma aplicação Spring Boot para se conectar e operar em um servidor Redis é uma tarefa comum em microsserviços e caching.
Dependência e Configuração
Adicione o starter do Spring Data Redis ao seu projeto.
<!-- Maven pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Configure as propriedades de conexão no arquivo application.properties.
# Configuração do Redis
spring.data.redis.database=0
spring.data.redis.host=localhost
spring.data.redis.port=6379
spring.data.redis.password=sua_senha_aqui
spring.data.redis.timeout=60000ms
# Configuração do pool de conexões com Lettuce
spring.data.redis.lettuce.pool.max-active=16
spring.data.redis.lettuce.pool.max-idle=8
spring.data.redis.lettuce.pool.min-idle=2
Configuração do RedisTemplate
Crie uma classe de configuração para definir o RedisTemplate com serializadores adequados.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class ConfiguracaoRedis {
@Bean
public RedisTemplate<String, Object> criarTemplateRedis(RedisConnectionFactory conexaoFabrica) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(conexaoFabrica);
// Serializador para as chaves
StringRedisSerializer serializadorChave = new StringRedisSerializer();
template.setKeySerializer(serializadorChave);
template.setHashKeySerializer(serializadorChave);
// Serializador para os valores (usa Jackson para objetos)
GenericJackson2JsonRedisSerializer serializadorValor = new GenericJackson2JsonRedisSerializer();
template.setValueSerializer(serializadorValor);
template.setHashValueSerializer(serializadorValor);
template.afterPropertiesSet();
return template;
}
}
Exemplo de Uso
Injete o RedisTemplate e realize operações em sua aplicação.
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class ServicoCacheRedis {
private final RedisTemplate<String, Object> redisTemplate;
public ServicoCacheRedis(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void armazenarDados(String chave, Object valor, long minutosExpiracao) {
redisTemplate.opsForValue().set(chave, valor, minutosExpiracao, TimeUnit.MINUTES);
}
public Object recuperarDados(String chave) {
return redisTemplate.opsForValue().get(chave);
}
}
Uma classe de teste simples para verfiicar a conexão:
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import javax.annotation.Resource;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@SpringBootTest
class TesteConexaoRedis {
@Resource
private RedisTemplate<String, String> templateRedis;
@Test
void deveConectarERecuperarValorPadrao() {
templateRedis.opsForValue().set("chave:teste", "valor:conexao");
String valor = templateRedis.opsForValue().get("chave:teste");
assertNotNull(valor, "O valor recuperado do Redis não deve ser nulo.");
System.out.println("Valor recuperado: " + valor);
}
}