天天看点

快速实现数据增删改查:Spring Boot集成Redis实战

作者:勇往直前的努力E8QY

简介

Redis是一款开源的基于内存的数据存储系统,可以作为数据库、缓存和消息中间件等用途,具备高性能、高可靠、可扩展性等优点。Spring Boot是快速构建Spring应用程序的框架,本文介绍如何在Spring Boot中很容易地集成Redis,并实现基本的数据增删改查功能。

环境搭建

本文示例使用的环境为:JDK 1.8,Spring Boot 2.5.2,Redis 6.0.16。

首先需要安装Redis并启动Redis服务端进程。Redis官网提供了多种安装方式,这里以源码方式安装为例:

  1. 下载Redis源码包:https://redis.io/download
  2. 解压缩Redis源码包:tar -zxvf redis-x.x.x.tar.gz
  3. 进入Redis源码目录并编译:make
  4. 启动Redis服务端:src/redis-server
  5. 启动Redis客户端:src/redis-cli

Spring Boot整合Redis

在Spring Boot中,只需在pom.xml中添加Redis相关依赖即可。

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

实现数据增删改查

(1)设置RedisTemplate

@Configuration
public class RedisConfig {
  @Bean
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(connectionFactory);

    //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK序列化方式)
    Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

    ObjectMapper objectMapper = new ObjectMapper();
    //设置全局忽略未知属性
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    //指定要序列化的域,_id表示所有属性都要被序列化
    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    //指定序列化输入的类型,如java.util.List<实体类>
    objectMapper.activateDefaultTyping(new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT).init(JsonTypeInfo.Id.CLASS, null), ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

    //使用StringRedisSerializer来序列化和反序列化redis的key值
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);

    //Hash类型同理:new Jackson2JsonRedisSerializer<>(Object.class)
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
  }
}
           

(2)定义实体类User

@Data 
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
  private String id;
  private String name;
  private Integer age;
}
           

(3)定义Repository层操作

@Repository
public class UserRepository {
  private static final String USER_PREFIX = "user:";

  @Autowired
  private RedisTemplate<String, Object> redisTemplate;

  public void save(User user) {
    redisTemplate.opsForValue().set(USER_PREFIX + user.getId(), user);
  }

  public User findById(String id) {
    return (User) redisTemplate.opsForValue().get(USER_PREFIX + id);
  }

  public void delete(String id) {
    redisTemplate.delete(USER_PREFIX + id);
  }

  public void update(User user) {
    save(user);
  }

  public List<User> findAll() {
    Set<String> keys = redisTemplate.keys(USER_PREFIX + "*");
    List<Object> objects = redisTemplate.opsForValue().multiGet(keys);
    return objects.stream().map(o -> (User) o).collect(Collectors.toList());
  }
}
           

(4)定义Controller层接口

@RestController
@RequestMapping("/user")
public class UserController {
  @Autowired
  private UserRepository userRepository;

  @PostMapping("")
  public void save(User user) {
    userRepository.save(user);
  }

  @GetMapping("/{id}")
  public User findById(@PathVariable String id) {
    return userRepository.findById(id);
  }

  @DeleteMapping("/{id}")
  public void delete(@PathVariable String id) {
    userRepository.delete(id);
  }

  @PutMapping("")
  public void update(User user) {
    userRepository.update(user);
  }

  @GetMapping("")
  public List<User> findAll() {
    return userRepository.findAll();
  }
}
           

结束语

通过以上步骤,我们已经成功地在Spring Boot中集成了Redis,并实现了基本的数据增删改查操作。在实际开发中,还需考虑性能优化、缓存穿透等问题。但是,这些问题不属于本文的讨论范围。希望该文章对您有所帮助。

继续阅读