A partir de la versión 2.0 de Spring Boot, la comunidad dará soporte a la librería Lettuce en lugar de a Jedis.
Vamos a mostrar un ejemplo simple de conexión de aplicación Spring Boot a un servidor Redis mediante ésta librería, en el que guardaremos en memoria un registro de estudiantes y su evaluación.

Instancia Redis

Para éste ejemplo será necesario contar con una instancia de Redis a la que podamos conectarnos. En mi caso utilizaré un contenedor creado a partir de la imagen oficial Redis de Docker .

Arrancaremos el servicio ejecutando:

docker run --name some-redis -p 6379:6379 -d redis

Comprobaremos la correcta instalación y conexión con algún cliente gráfico como Desktop Data Redis o a través de la terminal con redis-cli.

$ redis-cli

Tras ésto tendremos acceso a Redis:

127.0.0.1:6379> 

Probaremos el correcto funcionamiento con el comando PING:

127.0.0.1:6379> PING
PONG

Dependencias

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Configuración

Para éste ejemplo mostraremos la configuración de una conexión a un único nodo Redis.
Spring Boot Data Redis dispone también de soporte para conexión a sentinel, que nos dará la posibilidad de contar con múltiples servidores configurados como maestro-esclavo, monitorización, notificación en caso de error y toda una serie de características para contar con alta disponibilidad.

Configuración para conexión con un único nodo:

package com.juanmorschrott.redis.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;

@Configuration
public class RedisConfiguration {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisStandaloneConfiguration("127.0.0.1", 6379));
    }

}

Dominio

Para éste ejemplo crearemos la clase Student.java.
Indicaremos que utilizaremos el template de Redis Hash mediante la anotación @RedisHash, el @Id y le indicaremos que realice un indexado a partir del atributo name.

@Data
@RedisHash("Student")
public class Student implements Serializable {
    @Id
    private String id;
    @Indexed
    private String name;
    private String lastName;
    private Evaluation evaluation;
}

Repositorio

Podemos utilizar una interfaz que extienda CrudRepository:

package com.juanmorschrott.redis.repository;

import com.juanmorschrott.redis.domain.Student;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface StudentRepository extends CrudRepository<Student, String> {
    Student findByName(String name);
}

Prueba

Probaremos la correcta ejecución implementando la interfaz ApplicationRunner en nuestra clase principal.
Crearemos 2 estudiantes de prueba y leeremos los datos de uno de ellos haciendo una búsqueda por nombre.

@Override
public void run(ApplicationArguments args) throws Exception {
        studentRepository.deleteAll();

	Student s1 = new Student();
	s1.setName("Gabriel");
	Evaluation e1 = new Evaluation();
	e1.setImprove("Tiene muchas dificultades");
	s1.setEvaluation(e1);
	studentRepository.save(s1);

	Student s2 = new Student();
	s2.setName("Eric");
	Evaluation e2 = new Evaluation();
	e2.setImprove("No tiene interes por trabajar");
	s2.setEvaluation(e2);
	studentRepository.save(s2);

	Optional<Student> searchResult = studentRepository.findByName("Gabriel");

	System.out.println(searchResult.isPresent() ? searchResult : "Student not found");
}

Si todo funciona correctamente deberíamos ver en consola:

Optional[Student(id=1, name=Gabriel, lastName=null, evaluation=Evaluation(improve=Tiene muchas dificultades))]

Y conectándonos mediante redis-cli:

127.0.0.1:6379> HGETALL "Student:1"
1) "_class"
2) "com.juanmorschrott.redis.domain.Student"
3) "id"
4) "1"
5) "name"
6) "Gabriel"
7) "evalutation.improve"
8) "Tiene muchas dificultades"

Conclusión

Quedan por abarcar muchos detalles sobre todo lo que nos proporciona Redis como:
– Tipos de datos
Uso de RedisTemplates
– Sentinel y clusters Redis
– Transaccionalidad
Ésta ha sido una primera aproximación en la que mostramos como podemos conectar Spring Boot a Redis, leer y escribir datos de tipo Hash.
Podéis encontrar el ejemplo aquí.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *