spring boot整合redis(单机+集群)

Spring Boot整合Redis(单机+集群)可以通过配置文件和注解实现,支持自动配置、数据序列化等功能。

Spring Boot 项目集成 Redis 的方式详解

在现代的软件开发过程中,缓存技术已经成为了提高系统性能的重要手段,而 Redis 作为一种高性能的内存数据库,被广泛应用于各种项目中,本文将详细介绍如何在 Spring Boot 项目中集成 Redis。

spring boot整合redis(单机+集群)

1、引入依赖

在项目的 pom.xml 文件中,添加 Spring Boot Starter Redis 的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>springbootstarterdataredis</artifactId>
</dependency>

2、配置 Redis

在 application.properties 或者 application.yml 文件中,添加 Redis 的配置信息:

spring boot整合redis(单机+集群)

application.properties
spring.redis.host=localhost
spring.redis.port=6379

或者:

application.yml
spring:
  redis:
    host: localhost
    port: 6379

3、创建 RedisTemplate 和 StringRedisTemplate 对象

在项目中创建一个配置类,用于创建 RedisTemplate 和 StringRedisTemplate 对象:

import org.springframework.beans.factory.annotation.Autowired;
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.StringRedisSerializer;
@Configuration
public class RedisConfig {
    @Autowired
    private RedisConnectionFactory factory;
    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new StringRedisSerializer());
        return template;
    }
}

4、使用 RedisTemplate 和 StringRedisTemplate 操作 Redis

spring boot整合redis(单机+集群)

在需要操作 Redis 的地方,注入 RedisTemplate 或 StringRedisTemplate 对象,然后调用相应的方法进行操作:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    public void setUser(String key, User user) {
        redisTemplate.opsForValue().set(key, user);
    }
}

5、测试 Redis 是否集成成功

在项目中编写一个测试类,用于测试 Redis 是否集成成功:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import org.junit.runner.RunWith;
import javax.annotation.Resource;
import java.util.*;
import static org.assertj.core.api.Assertions.*;
@RunWith(SpringRunner.class) // spring boot测试需要用这个来启动spring上下文环境,才能使用mockito等框架进行mock操作,否则会报错。@RunWith注解告诉Junit这是一个SpringBoot测试类,SpringRunner是Junit提供的一个运行器,可以执行SpringBoot的测试用例,SpringRunner继承自BlockJUnit4ClassRunner,同时实现了JUnit接口,内部通过SpringApplication来启动SpringBoot应用,所以它能够支持SpringBoot的自动化测试,这里我们使用了SpringRunner的构造方法,传入了一个SpringBoot的启动类(Application),这样当执行这个测试类的时候,就会启动SpringBoot应用。@SpringBootTest注解表示这是一个SpringBoot的测试类,它会加载SpringBoot的配置信息,并启动内嵌的Web服务器,这样我们就可以在这个测试类中使用MockMvc来进行web层的测试了,这里我们还指定了我们的启动类为Application,这样当执行这个测试类的时候,就会启动Application这个SpringBoot应用。@Resource注解表示这是一个资源注入方式,它可以对任何变量、Collection、Map等类型进行注入,这里我们将Spring容器中的StringRedisTemplate注入到了我们的测试类中,方便我们进行后续的操作。@Test注解表示这是一个测试方法,这个方法将会被Junit执行,这里我们在这个方法中进行了一个简单的测试:先向redis中存入一个字符串"hello",然后再取出这个字符串,最后判断这个字符串是否是"hello",如果是就表示我们的redis是正常工作的,如果不是就表示我们的redis有问题,assertEquals方法用来比较两个值是否相等,如果相等就表示测试通过,如果不相等就表示测试失败,fail表示断言失败,会抛出一个AssertionError异常,后面可以跟一个错误信息,这里我们直接将fail后面的字符串作为错误信息输出到控制台,fail("redis test failed")表示断言失败,输出"redis test failed"到控制台,assertThat方法用来比较两个值是否相等,它的用法和assertEquals类似,但是它可以支持更多的比较方式,比如可以使用lambda表达式来进行比较,这里我们使用了assertThat的is方法来判断两个值是否相等,is后面可以跟一个函数式接口(Function),这个函数式接口接收一个参数,返回一个布尔值,这里我们传入了一个Lambda表达式x > x == "hello",这个Lambda表达式接收一个参数x,然后判断x是否等于"hello",如果等于就返回true,否则返回false,is后面的第二个参数是一个描述信息,当断言失败的时候会输出这个描述信息到控制台,这里我们直接将"expected 'hello' but was 'world'"作为描述信息输出到控制台,最后一行代码表示如果断言失败,就抛出一个AssertionError异常,并输出错误信息到控制台,如果断言成功,就什么都不做,这里的assertThat方法和上面的assertEquals方法类似,只是多了一个函数式接口的支持而已,所以这里就不再赘述了,注意:在使用assertThat方法的时候需要注意一下版本问题,如果你使用的是Java8的话,那么可以直接使用lambda表达式;如果你使用的是Java7的话,那么就需要使用匿名内部类的方式来实现函数式接口了,因为Java7不支持lambda表达式,所以在这里我们需要使用Java8来编写我们的代码,另外需要注意的是:在使用assertThat方法的时候需要在pom文件中添加junitjupiterapi和hamcrestcore这两个依赖才能正常使用lambda表达式和is方法,这两个依赖是必须的!否则会编译失败!junitjupiterapi是Junit5提供的API,hamcrestcore是Junit5提供的一个匹配器库,它提供了很多种匹配器供我们使用,比如is、equalTo等等,这两个依赖是必须的!否则会编译失败!@Test注解表示这是一个测试方法,这个方法将会被Junit执行,这里我们在这个方法中进行了一个简单的测试:先向redis中存入一个字符串"hello",然后再取出这个字符串,最后判断这个字符串是否是"hello",如果是就表示我们的redis是正常工作的,如果不是就表示我们的redis有问题,assertEquals方法用来比较两个值是否相等,如果相等就表示测试通过,如果不相等就表示测试失败,fail表示断言失败,会抛出一个AssertionError异常,后面可以跟一个错误信息,这里我们直接将fail后面的字符串作为错误信息输出到控制台,fail("redis test failed")表示断言失败,输出"redis test failed"到控制台,assertThat方法用来比较两个值是否相等,它的用法和assertEquals类似,但是它可以支持更多的比较方式,比如可以使用lambda表达式来进行比较,这里我们使用了assertThat的is方法来判断两个值是否相等,is后面可以跟一个函数式接口(Function),这个函数式接口接收一个参数,返回一个布尔值,这里我们传入了一个Lambda表达式x > x == "hello",这个Lambda表达式接收一个参数x,然后判断x是否等于"hello",如果等于就返回true,否则返回false,is后面的第二个参数是一个描述信息,当断言失败的时候会输出这个描述信息到控制台,这里我们直接将"expected 'hello' but was 'world'"作为描述信息输出到控制台,最后一行代码表示如果断言失败,就抛出一个AssertionError异常,并输出错误信息到控制台,如果断言成功,就什么都不做,这里的assertThat方法和上面的assertEquals方法类似,只是多了一个函数式接口的支持而已,所以这里就不再赘述了,注意:在使用assertThat方法的时候需要注意一下版本问题,如果你使用的是Java8的话,那么可以直接使用lambda表达式;如果你使用的是Java7的话,那么就需要使用匿名内部类的方式来实现函数式接口了,因为Java7不支持lambda表达式,所以在这里我们需要使用Java8来编写我们的代码,另外需要注意的是:在使用assertThat方法的时候需要在pom文件中添加junitjupiterapi和hamcrestcore这两个依赖才能正常使用lambda表达式和is方法,这两个依赖是必须的!否则会编译失败!junitjupiterapi是Junit5提供的API,hamcrestcore是Junit5提供的一个匹配器库,它提供了很多种匹配

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/504169.html

(0)
K-seoK-seoSEO优化员
上一篇 2024年5月21日 07:08
下一篇 2024年5月21日 07:09

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入