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:
| GeoOperations | Redis geospatial operations |
| HashOperations | Redis hash operations |
| HyperLogLogOperations | Redis HyperLogLog operations |
| ListOperations | Redis list operations |
| SetOperations | Redis set operations |
| ValueOperations | Redis string (or value) operations |
| ZSetOperations | Redis 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í .