在 Spring Boot 项目中结合 Redis 进行操作是非常常见的需求。Redis 是一个高性能的键值存储系统,常用于缓存、消息队列等场景。下面是一个详细的步骤指南,介绍如何在 Spring Boot 项目中集成 Redis,并提供一些常用的操作示例。

1. 添加依赖

首先,在 pom.xml 文件中添加 Spring Boot 和 Redis 的相关依赖。

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Data Redis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <!-- Lombok for getter/setter/toString/etc. -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
        <scope>provided</scope>
    </dependency>

    <!-- Spring Boot Starter Test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2. 配置 Redis 连接

application.propertiesapplication.yml 文件中配置 Redis 连接信息。

application.properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=your_password
spring.redis.database=0
application.yml
spring:
  redis:
    host: localhost
    port: 6379
    password: your_password
    database: 0

3. 创建 Redis 配置类

虽然 Spring Boot 默认已经配置了 Redis,但可以创建一个配置类来自定义 Redis 模板和连接工厂。

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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
}

4. 创建 Redis 操作工具类

为了方便使用 Redis,可以创建一个工具类来封装常用的操作。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 设置单个值
    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    // 设置单个值并设置过期时间
    public void set(String key, Object value, long time) {
        redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
    }

    // 获取单个值
    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    // 删除单个值
    public boolean delete(String key) {
        return redisTemplate.delete(key);
    }

    // 判断某个键是否存在
    public boolean hasKey(String key) {
        return redisTemplate.hasKey(key);
    }

    // 设置多个值
    public void setMap(String key, Map<String, Object> map) {
        redisTemplate.opsForHash().putAll(key, map);
    }

    // 获取多个值
    public Map<Object, Object> getMap(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    // 设置列表值
    public void setList(String key, List<Object> list) {
        redisTemplate.opsForList().rightPushAll(key, list);
    }

    // 获取列表值
    public List<Object> getList(String key) {
        return redisTemplate.opsForList().range(key, 0, -1);
    }

    // 设置集合值
    public void setSet(String key, Set<Object> set) {
        redisTemplate.opsForSet().add(key, set.toArray());
    }

    // 获取集合值
    public Set<Object> getSet(String key) {
        return redisTemplate.opsForSet().members(key);
    }
}

5. 创建 Controller 层

创建控制器层来处理 HTTP 请求,并使用 Redis 工具类进行操作。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/redis")
public class RedisController {

    @Autowired
    private RedisUtil redisUtil;

    @PostMapping("/set")
    public String set(@RequestParam String key, @RequestParam String value) {
        redisUtil.set(key, value);
        return "Value set successfully";
    }

    @GetMapping("/get")
    public Object get(@RequestParam String key) {
        return redisUtil.get(key);
    }

    @PostMapping("/setMap")
    public String setMap(@RequestParam String key, @RequestBody Map<String, String> map) {
        redisUtil.setMap(key, map);
        return "Map set successfully";
    }

    @GetMapping("/getMap")
    public Map<Object, Object> getMap(@RequestParam String key) {
        return redisUtil.getMap(key);
    }

    @PostMapping("/setList")
    public String setList(@RequestParam String key, @RequestBody List<String> list) {
        redisUtil.setList(key, list);
        return "List set successfully";
    }

    @GetMapping("/getList")
    public List<Object> getList(@RequestParam String key) {
        return redisUtil.getList(key);
    }

    @PostMapping("/delete")
    public String delete(@RequestParam String key) {
        redisUtil.delete(key);
        return "Key deleted successfully";
    }
}

6. 启动类

确保启动类位于正确的包路径下,以便 Spring Boot 自动扫描到所有组件。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

7. 测试

启动应用并测试各个接口是否正常工作。

mvn spring-boot:run

可以使用 Postman 或其他 HTTP 客户端来测试这些接口。

快捷方式和最佳实践

  1. Lombok:使用 Lombok 可以大大减少样板代码,如 gettersettertoString 等。
  2. 全局异常处理:使用 @ControllerAdvice 注解创建全局异常处理器,统一处理异常。
  3. 日志记录:使用 logbacklog4j2 配置日志记录,方便调试和监控。
  4. 性能优化:合理设置 Redis 的过期时间和内存限制,避免内存溢出。
  5. 安全性:确保 Redis 服务器的安全性,如设置密码、限制访问 IP 等。