Operações com Tipos de Dados Comuns no Redis e Conexão com Spring Boot

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);
    }
}

Tags: Redis spring-boot nosql key-value-store data-structures

Publicado em 6-10 18:20 por Thomas