老早就想记录一下Springboot项目中整合Redis的过程,今天终于忍不住对它下手了(在整合Redis之前,需确保redis处于启动状态)
废话不多说,直接新建Springboot项目。
Springboot整合Redis |
<!-- 引入连接池的依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.7.0</version>
</dependency>
3.在application.properties配置文件中配置redis连接信息
server:
port: 8082
spring:
redis:
database: 4 #使用redis中哪个库
port: 6379
host:192.168.138.121
password: 123456 #redis连接密码
timeout: 60000 #连接超时时间
lettuce: #由于Spring Boot2.x 的改动,连接池相关配置需要通过spring.redis.lettuce.pool或者 spring.redis.jedis.pool 进行配置
pool:
max-active: 200 #连接池最大连接数(使用负值表示没有限制) 默认8
max-wait: -1 #连接池最大阻塞等待时间(使用负值表示没有限制)
min-idle: 0 #连接池中的最小空闲连接
max-idle: 10 #连接池中的最大空闲连接
4.写一个测试controller(当然也可以用Junit启动进行测试,我个人习惯写个controller,通过浏览器访问进行测试)
@RestController
public class testController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
*在redis中有两个模板可以使用,最后专门说明
*/
// private RedisTemplate<Object, Object> redisTemplate;
@RequestMapping("/set")
@ResponseBody
public Object setValue() {
stringRedisTemplate.opsForValue().set("name", "zhangsan");
return "走了 set ";
}
@RequestMapping("/get")
@ResponseBody
public Object getValue() {
return stringRedisTemplate.opsForValue().get("name");
}
}
5.启动项目,首先访问localhost:8082//set
,然后redis就会在4号库中以key value的形式将name 和 zhangsan
存储起来。
6.下面看一下redis中的4号库是否存储了key为name,value为zhangsan的数据。我这里直接使用的是Redis Desktop Manager
工具来操作的redis。这样方便我们查看redis中的值的存储情况。
7.从redis管理工具中我们可以看到4号库中确实存了一个key为name,value为zhangsan的一组数据。说明我们的reids集成正常。下面看一个get取值。
在浏览器中访问localhost:8082//get
,然后看看返回的结果。
返回结果正常。到这里,简单的redis集成OK了,下面说一下集成的过程中,有哪些点需要注意的。
需要留意的点 |
在前面创建项目的过程中,提到了Redis中默认是有两个模板可以使用,分别是StringRedisTemplate
和RedisTemplate
,这个当我们在引入了Redis相关的依赖之后,在其自动配置类RedisAutoConfiguration
中就可以看到(可以在idea中 搜索此配置类进行查看)。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
两种模板的区别 |
StringRedisTemplate
:
采用的String序列化方式,redis中存储的key和value都是可读的。
在上面的代码中,我们使用的就是此模板来进行存值的,所以在redis中,我们能够很直观的看到key和value。
RedisTemplate
:
采用的JDK序列化方式,将key和value序列化为字节数组之后,再存储到redis中,当取值的时候,再将redis中的值反序列化之后进行返回。
我们在测试controller中,使用redisTemplate模板来存值,看一下redis中的值是什么款式
@RestController
public class testController {
@Autowired
// private StringRedisTemplate stringRedisTemplate;
/**
*在redis中有两个模板可以使用,最后专门说明
*/
private RedisTemplate<Object, Object> redisTemplate;
@RequestMapping("/set")
@ResponseBody
public Object setValue() {
redisTemplate.opsForValue().set("name", "zhangsan");
return "走了 set ";
}
@RequestMapping("/get")
@ResponseBody
public Object getValue() {
return redisTemplate.opsForValue().get("name");
}
}
总结:
1.因为两种模板的序列化方式不同,所以存储的数据互不相同。也就是说:
用RedisTemplate存的值不能用StringRedisTemplate来取值
用StringRedisTemplate存的值不能用RedisTemplate来取值
2.两种模板如何选择?
StringRedisTemplate适合用来存储字符串类型的数据
RedisTemplate适合用来存储复杂的对象类型的数据