SpringBoot整合Redis

0.一些对象信息

  • 1.JedisPoolConfig(这个是配置连接池)

  • 2.RedisConnectionFactory(这个是配置连接信息,这里的RedisConnectionFactory是一个接口,
    我们需要使用它的实现类,在SpringD Data Redis方案中提供了一下四种工厂模型)

    • JredisConnectionFactory
    • JedisConnectionFactory
    • LettuceConnectionFactory
    • SrpConnectionFactory
  • 3.RedisTemplate

1.添加启动类

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置连接信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# redis索引,默认为0
spring.redis.database=1
# redis服务地址
spring.redis.host=127.0.0.1
# 端口
spring.redis.port=6379
# 连接池最大连接数
spring.redis.jedis.pool.max-active=8
# 连接池中最大空闲连接数
spring.redis.jedis.pool.max-idle=10
# 连接池最大阻塞等待时间
spring.redis.jedis.pool.max-wait=-1
# 连接池最小空闲连接数
spring.redis.jedis.pool.min-idle=0
# 连接超时时间
spring.redis.lettuce.shutdown-timeout=1000

3.测试

1
2
3
4
5
6
7
8
@Autowired
private RedisTemplate<String, String> redisTemplate;

@Test
public void test() {
redisTemplate.opsForValue().set("mykey","myvalue");
System.out.println(redisTemplate.opsForValue().get("mykey"));
}

4.序列化器

这里先说一下Spring提供了那些序列化器(各自作用自行百度,这里不再赘述)
Jackson2JsonRedisSerializer
JdkSerializationRedisSerializer
OxmSerializer
StringRedisSerializer
GenericToStringRedisSerializer
GenericJackson2JsonRedisSerializer

为什么前面的代码没有设置序列化?
原因是是因为我们使用了@AutoWired,IOC容器为我们选择了StringRedisTemplate类来注入

这里是RedisTemplate的继承关系图

然后我们跟踪源码可以发现StringRedisTemplate.java

1
2
3
4
5
6
public StringRedisTemplate() {
setKeySerializer(RedisSerializer.string());
setValueSerializer(RedisSerializer.string());
setHashKeySerializer(RedisSerializer.string());
setHashValueSerializer(RedisSerializer.string());
}

那假如我们把Value的类型改为Object呢

1
2
3
4
5
6
7
8
@Resource
private RedisTemplate<String, Object> redisTemplate;

@Test
public void test() {
redisTemplate.opsForValue().set("mykey","myvalue");
System.out.println(redisTemplate.opsForValue().get("mykey"));
}

这里继续使用@AutoWired会报错,需要使用@Resource,这两个注解的区别在前者是根据类型后者
是根据名字,具体区别自行查资料(这里说一下为什么会报错:@AutoWired找不到该类型
<String,Object>的Bean因为根本没有。使用@Resource直接注入的是RedisTemplate)

这是因为没有设置序列化器,RedisTemplate选择了默认的序列化器JdkSerializationRedisSerializer

5.配置序列化器

5.1实体类实现序列化接口
5.2然后在配置类中设置序列化器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* @author liyuan.zhang
* @date 2021/3/4 15:49
*/
@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, User> redisTemplate = new RedisTemplate<>();
// 关联
redisTemplate.setConnectionFactory(factory);
// 设置key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置value的序列化器
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<User>(User.class));
return redisTemplate;
}
}
5.3测试类
1
2
3
4
5
6
7
8
9
@Autowired
private RedisTemplate<String, User> redisTemplate;

@Test
public void test1() {
redisTemplate.opsForValue().set("user", User.builder().name("张三").address("上海市").id("1").birthday(new Date()).build());
User user = redisTemplate.opsForValue().get("user");
System.out.println(user);
}

评论