Spring Boot 项目集成 Redis 的方式详解
在现代的软件开发过程中,缓存技术已经成为了提高系统性能的重要手段,而 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 的配置信息:
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
在需要操作 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