Spring Boot 整合 Redis 步骤详解

文章目录

  • [1. 引言](#1. 引言)
  • [2. 添加依赖](#2. 添加依赖)
  • [3. 配置 Redis 连接信息](#3. 配置 Redis 连接信息)
  • [4. 创建 Redis 操作服务类](#4. 创建 Redis 操作服务类)
  • [5. 使用 RedisTemplate 或 ReactiveRedisTemplate](#5. 使用 RedisTemplate 或 ReactiveRedisTemplate)
  • [6. 测试 Redis 功能](#6. 测试 Redis 功能)
  • [7. 注意事项](#7. 注意事项)
  • [8. 总结](#8. 总结)

Redis 是一个高性能的键值存储系统,常用于缓存、消息队列等多种场景。将 Redis 与 Spring Boot 结合使用可以极大提升应用的性能和响应速度。本文将详细介绍如何在 Spring Boot 应用中整合 Redis,并通过示例代码展示具体实现步骤。

1. 引言

随着互联网应用对快速读写数据的需求日益增长,传统的数据库已经难以满足某些特定场景下的性能要求。Redis 凭借其内存级的数据访问速度、丰富的数据结构支持以及简单易用的 API,成为了许多开发者的首选。接下来,我们将一步步介绍如何在 Spring Boot 中集成 Redis。

2. 添加依赖

首先,在 pom.xml 文件中添加 Spring Data Redis 和 Jedis(或 Lettuce)客户端的 Maven 依赖:

xml 复制代码
<dependencies>
	<dependency>
	     <groupId>org.springframework.boot</groupId>
	     <artifactId>spring-boot-starter-web</artifactId>
	 </dependency>
	
	 <dependency>
	     <groupId>org.springframework.boot</groupId>
	     <artifactId>spring-boot-starter-test</artifactId>
	     <scope>test</scope>
	 </dependency>
	
	 <!-- Spring Boot Starter for Redis -->
	 <dependency>
	     <groupId>org.springframework.boot</groupId>
	     <artifactId>spring-boot-starter-data-redis</artifactId>
	 </dependency>
	
	 <dependency>
	     <groupId>org.projectlombok</groupId>
	     <artifactId>lombok</artifactId>
	 </dependency>
	
	 <dependency>
	     <groupId>com.alibaba</groupId>
	     <artifactId>fastjson</artifactId>
	     <version>1.2.83</version>
	 </dependency>
        
    <!-- Jedis or Lettuce client -->
    <!-- Choose one of the following two dependencies -->

    <!-- For Jedis -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>

    <!-- Or for Lettuce -->
    <dependency>
        <groupId>io.lettuce</groupId>
        <artifactId>lettuce-core</artifactId>
    </dependency>
</dependencies>

3. 配置 Redis 连接信息

接下来,在 application.properties 或 application.yml 文件中配置 Redis 的连接参数。这里以 .yml 文件为例:

yaml 复制代码
server:
  port: 8082
spring:
  data:
    redis:
      host: localhost
      port: 6379
      password: 123456

4. 创建 Redis 操作服务类

Java实体

java 复制代码
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Description
 * @Author HaleyHu
 * @Date 2024/12/5 23:41
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String username;
    private int age;
}

用户接口类

java 复制代码
import org.hbin.redis.entity.User;

/**
 * @Description
 * @Author HaleyHu
 * @Date 2024/12/5 23:44
 */
public interface UserService {
    User query(Long id);

    Boolean expired(Long id);
}

接口实现类

java 复制代码
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import org.hbin.redis.entity.User;
import org.hbin.redis.service.UserService;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

/**
 * @Description
 * @Author HaleyHu
 * @Date 2024/12/5 23:46
 */
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
    private final RedisTemplate<String, String> redisTemplate;

    private final String REDIS_PREFIX_KEY = "User::";

    @Override
    public User query(Long id) {
        Object obj = redisTemplate.opsForValue().get("User::" + id);
        if(obj != null) {
            return JSON.parseObject(obj.toString(), User.class);
        }

        // 模拟从DB查询
        User user = new User(id, "user" + id, 20);
        redisTemplate.opsForValue().set(REDIS_PREFIX_KEY + id, JSON.toJSONString(user));
        return user;
    }

    @Override
    public Boolean expired(Long id) {
        return redisTemplate.delete(REDIS_PREFIX_KEY + id);
    }
}

Controller代码

java 复制代码
import lombok.RequiredArgsConstructor;
import org.hbin.redis.entity.User;
import org.hbin.redis.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description
 * @Author HaleyHu
 * @Date 2024/12/5 23:46
 */
@RequiredArgsConstructor
@RestController
public class UserController {
    private final UserService userService;

    @GetMapping("/query")
    public User query(@RequestParam Long id) {
        return userService.query(id);
    }

    @GetMapping("/expired")
    public String expired(@RequestParam Long id) {
        return userService.expired(id).toString();
    }
}

如果你想处理更复杂的数据类型(如对象),则需要使用 RedisTemplate 并配置序列化器。例如,使用 Jackson JSON 序列化器:

java 复制代码
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        serializer.setObjectMapper(objectMapper);

        template.setValueSerializer(serializer);
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);

        template.afterPropertiesSet();
        return template;
    }
}

5. 使用 RedisTemplate 或 ReactiveRedisTemplate

Spring Data Redis 提供了两种主要的方式来与 Redis 进行交互:同步方式 (RedisTemplate) 和响应式编程方式 (ReactiveRedisTemplate)。根据你的需求选择合适的方式。

同步方式 (RedisTemplate)

这是最常见的方式,适用于大多数应用场景。

响应式编程方式 (ReactiveRedisTemplate)

如果你的应用采用了响应式编程模型(如 WebFlux),那么 ReactiveRedisTemplate 可能更适合你。它允许你以非阻塞的方式与 Redis 进行通信。

6. 测试 Redis 功能

最后,我们可以通过编写单元测试来验证 Redis 的基本功能是否正常工作。也可以部署运行上述程序来验证。访问路径:
http://localhost:8082/query?id=1
http://localhost:8082/expired?id=1

7. 注意事项

  • 生产环境配置:在生产环境中部署时,请确保正确配置 Redis 的安全设置(如密码保护、网络限制等),并考虑启用持久化选项以防止数据丢失。
  • 性能优化:合理调整连接池参数,避免过多的连接消耗资源;同时也可以根据业务特点选用合适的序列化器来提高性能。
  • 监控和维护:定期检查 Redis 的运行状态,及时清理过期数据,保持系统的稳定性和高效性。

8. 总结

通过上述步骤,我们成功地在 Spring Boot 应用中集成了 Redis,并实现了基本的数据缓存功能。这不仅提高了应用的性能,还为开发者提供了更多灵活的数据管理手段。

相关推荐
是梦终空3 分钟前
JAVA毕业设计210—基于Java+Springboot+vue3的中国历史文化街区管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·历史文化街区管理·景区管理
荆州克莱8 分钟前
Golang的图形编程基础
spring boot·spring·spring cloud·css3·技术
m0_7482350719 分钟前
springboot中配置logback-spring.xml
spring boot·spring·logback
m0_5127446428 分钟前
springboot使用logback自定义日志
java·spring boot·logback
github_czy4 小时前
(k8s)k8s部署mysql与redis(无坑版)
redis·容器·kubernetes
大叔_爱编程7 小时前
wx030基于springboot+vue+uniapp的养老院系统小程序
vue.js·spring boot·小程序·uni-app·毕业设计·源码·课程设计
计算机学姐9 小时前
基于微信小程序的驾校预约小程序
java·vue.js·spring boot·后端·spring·微信小程序·小程序
小白的一叶扁舟10 小时前
深入剖析 JVM 内存模型
java·jvm·spring boot·架构
sjsjsbbsbsn10 小时前
基于注解实现去重表消息防止重复消费
java·spring boot·分布式·spring cloud·java-rocketmq·java-rabbitmq
苹果醋310 小时前
golang 编程规范 - Effective Go 中文
java·运维·spring boot·mysql·nginx