Spring Redis pertenece a la familia Spring Data. Esta herramienta nos proporciona utilidades para que de forma más sencilla podamos configurar el acceso a la base de datos NoSQL Redis y un template para realizar las operaciones más comunes sobre los datos almacenados.
En esta lección veremos cómo configurar con Maven un proyecto para utilizar la clase RedisTemplate que nos da soporte para utilizar Redis. También crearemos una clase Repository que proporcionará las operaciones más comunes sobre una base de datos Redis.
Ahora que conocemos un poquito más Redis, vamos a modificar el proyecto para realizar operaciones sobre los datos. Por favor agregar la siguiente dependencia al archivo pom.xml, la cual nos dará la posibilidad de realizar una configuración con más propiedades de la base de datos Redis.
<dependency>
<groupId> redis.clients</groupId>
<artifactId> jedis</artifactId>
</dependency>
package com.pragma.redis.redistest.config;
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.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
@Configuration
public class JedisConfig {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new
RedisStandaloneConfiguration("127.0.0.1", 6379);
return new
>JedisConnectionFactory(redisStandaloneConfiguration);
}
@Bean
public RedisTemplate<string, object=""> redisTemplate() {
RedisTemplate<string, object> template = new RedisTemplate<>();
template .setConnectionFactory(jedisConnectionFactory());
return template;
}
}
Por defecto JedisConnectionFactory configura una conexión en localhost en el puerto por defecto de Redis 6379. Si tienes otra configuración en Redis debes configurar también tu JedisConnectionFactory.
Por favor crear un modelo de usuario que se pueda serializar para ser almacenado como información en la base de datos Redis.
Como ejemplo para el ejercicio práctico se tiene el siguiente modelo de usuario.
package com.pragma.redis.redistest.model;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String lastName;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
package com.pragma.redis.redistest.repository;
import java.util.List;
import java.util.Map;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;
import com.pragma.redis.redistest.model.User;
@Repository
public class UserRepository {
public static final String USER_KEY = "USER";
private HashOperations hashOperations;
private RedisTemplate redisTemplate;
public UserRepository(RedisTemplate redisTemplate){
this.redisTemplate = redisTemplate;
this.hashOperations = this.redisTemplate.opsForHash();
}
public void save(User user) {
hashOperations.put(USER_KEY, user.getId(), user);
}
public List findAll(){
return hashOperations.values(USER_KEY);
}
public User findById(String id) {
return (User) hashOperations.get(USER_KEY, id);
}
public void update(User user) {
save(user);
}
public void delete(String id) {
hashOperations.delete(USER_KEY, id);
}
}
Se debe crear una clase controlador para exponer los servicios Restful que realicen el CRUD correspondiente en la base de datos Redis.
package com.pragma.redis.redistest.api;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.pragma.redis.redistest.model.User;
import com.pragma.redis.redistest.repository.UserRepository;
@RestController
@CrossOrigin
@RequestMapping("/users")
public class ApiUserController {
@Autowired
private UserRepository userRepository;
@PostMapping
public User save(@RequestBody User user){
userRepository.save(user);
return user;
}
@GetMapping
public List list(){
return userRepository.findAll();
}
@GetMapping("/{id}")
public User getUser(@PathVariable String id){
return userRepository.findById(id);
}
@PutMapping
public User update(@RequestBody User user){
userRepository.update(user);
return user;
}
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable String id){
userRepository.delete(id);
return id;
}
}