rocks stack

Spring Boot Data Redis es un módulo que nos proporciona un conjunto de funcionalidades para interactuar con Redis. RedisTemplate es la clase central de dicho módulo y se encarga, por ejemplo, de la serialización y deserialización, (transformar datos obtenidos de Redis a nuestro dominio y viceversa) o de proporcionarnos una interfaz para ejecutar operaciones (manejar una lista o implementar un bus de mensajes) .

En definitiva, Redis Template es una capa de abstracción a alto nivel de todos los tipos de datos y comandos de los que dispone Redis.

Si utilizamos RedisTemplate como en el ejemplo mostrado anteriormente, en el que realizábamos operaciones CRUD, éste se limitará a crear un dato de tipo Hash, en el que se serializará un objeto dado y los miembros de su jerarquía. Es recomendable no utilizar objetos demasiado complejos ya que penalizan notablemente el rendimiento.
En el caso de querer utilizar otro tipo de datos u operaciones contamos con los siguientes:

GeoOperationsRedis geospatial operations
HashOperationsRedis hash operations
HyperLogLogOperationsRedis HyperLogLog operations
ListOperationsRedis list operations
SetOperationsRedis set operations
ValueOperationsRedis string (or value) operations
ZSetOperationsRedis zset (or sorted set) operations

Ejemplo

En éste ejemplo se va a comparar la creación de una lista, leer, escribir y borrar datos directamente en Redis con su equivalente en una aplicación Spring Boot.
Voy a mostrar un ejemplo simple en el que voy a crear una lista de colegios, insertar 2 valores en dicha lista mediante el comando “LPUSH” (Left push) , leer el contenido y finalmente borrar los registros.

Ejecución a través de redis-cli

Si nos conectamos a través de redis-cli a un servidor o cluster Redis, ésta sería la secuencia de comandos equivalente a la aplicación Spring Boot de ejemplo.
En primer lugar creamos la lista “Schools” en la que insertamos 2 valores:

127.0.0.1:6379> LPUSH "Schools" "San Ildefonso"
(integer) 1
127.0.0.1:6379> LPUSH "Schools" "La Porciuncula"
(integer) 2

A continuación, obtenemos los valores recién insertados:

127.0.0.1:6379> LRANGE "Schools" 0 10
1) "La Porciuncula"
2) "San Ildefonso"

Y finalmente eliminamos la lista:

127.0.0.1:6379> LREM "Schools" -1 "La Porciuncula"
(integer) 1
127.0.0.1:6379> LREM "Schools" -1 "San Ildefonso"
(integer) 1

Ejecución a través de Spring Boot

En primer lugar añadiremos a nuestro modelo la clase Escuela:

package com.juanmorschrott.redis.domain;

import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.index.Indexed;

import java.io.Serializable;

@Data
@ToString
public class School implements Serializable {
    @Id
    private String id;
    @Indexed
    private String name;
}

Añadiremos el bean RedisTemplate en nuestro fichero de configuración para poder disponer de el en nuestra aplicación:

@Bean
public RedisTemplate<String, School> redisTemplate() {
    RedisTemplate<String, School> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory());
    redisTemplate.setEnableTransactionSupport(true);
    return redisTemplate;
}

A continuación crearemos nuestro repositorio específico para nuestra lista de colegios utilizando el bean recién añadido.
Éste nos proporciona la capacidad de ejecutar operaciones en listas:

package com.juanmorschrott.redis.repository;

import com.juanmorschrott.redis.domain.School;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class SchoolRepository {

    private static final String KEY = "schools";

    @Autowired
    private RedisTemplate<String, School> redisTemplate;

    public List<School> findAll() {
        return redisTemplate.opsForList().range(KEY, 0, 10);
    }

    public void addSchool(School school) {
        redisTemplate.opsForList().leftPush(KEY, school);
    }

    public void removeSchool(School school) {
        redisTemplate.opsForList().remove(KEY, 1, school);
    }

}

Y por último, ejecutamos las operaciones:

System.out.println("List operations example:");
School sc1 = new School();
sc1.setName("San Ildefonso");
schoolRepository.addSchool(sc1);

School sc2 = new School();
sc2.setName("La Porciuncula");
schoolRepository.addSchool(sc2);

List<School> schools = schoolRepository.findAll();
for (School s : schools) {
	System.out.println("  * " + s.getName());
}
System.out.println("---------");

schoolRepository.removeSchool(sc1);
schoolRepository.removeSchool(sc2);

Conclusión

RedisTemplate es el eje central en nuestras operaciones con Redis. Su uso en nuestra aplicación Spring nos puede facilitar mucho la vida.
Podéis encontrar el código de ejemplo aquí .

Deja un comentario

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

Translate