在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。那么使用SpringBoot整合Redis
需要那些步骤呢。
1.JedisPoolConfig(这个是配置连接池)
2.RedisConnectionFactory(这个是配置连接信息,这里的RedisConnectionFactory是一个接口,
我们需要使用它的实现类,在SpringD Data Redis方案中提供了一下四种工厂模型)
JredisConnectionFactory
JedisConnectionFactory
LettuceConnectionFactory
SrpConnectionFactory
3.RedisTemplate
1、添加启动器
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置连接信息
spring:
redis:
host: 127.0.0.1
port: 6379
password: 123456
jedis:
pool:
max-active: 100
max-wait: -1
max-idle: 100
min-idle: 0
lettuce:
shutdown-timeout: 0
maxActive是最大激活连接数,这里取值为100,表示同时最多有100个数据库连接。
maxIdle是最大的空闲连接数,这里取值为100,表示即使没有数据库连接时依然可以保持100空闲的连接,而不被清除,随时处于待命状态。
MaxWait是最大等待秒钟数,这里取值-1,表示无限等待,直到
超时为止,也可取值9000,表示9秒后超时。
3、测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test_1{
@Autowired
private RedisTemplate<String,String>redisTemplate;
@Test
public void set(){
redisTemplate.opsForValue().set("myKey","myValue");
System.out.println(redisTemplate.opsForValue().get("myKey"));
}
}
4、查看结果
5、序列化器
这里先说一下Spring提供了那些序列化器(各自作用自行百度,这里不再赘述)
Jackson2JsonRedisSerializer
JdkSerializationRedisSerializer
OxmSerializer
StringRedisSerializer
GenericToStringRedisSerializer
GenericJackson2JsonRedisSerializer
然后以下是一些问题需要搞清楚
1 为什么需要序列化?
你要记住一句话,在JAVA中,一切皆对象,而将对象的状态信息转为存储或传输的形式需要序列化。
2 为什么前面的代码没有设置序列化?
原因是是因为我们使用了@AutoWired,IOC容器为我们选择了StringRedisTemplate类来注入
以下是单步调试的截图
这里是RedisTemplate的继承关系图
然后我们跟踪源码可以发现
StringRedisTemplate.java
public StringRedisTemplate() {
setKeySerializer(RedisSerializer.string());
setValueSerializer(RedisSerializer.string());
setHashKeySerializer(RedisSerializer.string());
setHashValueSerializer(RedisSerializer.string());
}
RedisSerializer.java
static RedisSerializer<String> string() {
return StringRedisSerializer.UTF_8;
}
StringRedisSerializer.java
public static final StringRedisSerializer UTF_8 = new StringRedisSerializer(StandardCharsets.UTF_8);
StringRedisTemplate默认选择的StringRedisSerializer序列化器
6 那假如我们把Value的类型改为Object呢?
RunWith(SpringRunner.class)
@SpringBootTest
public class Test_1{
@Resource
private RedisTemplate<String,Object>redisTemplate;
@Test
public void set(){
redisTemplate.opsForValue().set("myKey","myValue");
System.out.println(redisTemplate.opsForValue().get("myKey"));
}
}
注意:这里继续使用@AutoWired会报错,需要使用@Resource,这两个注解的区别在前者是根据类型后者
是根据名字,具体区别自行查资料(这里说一下为什么会报错:@AutoWired找不到该类型
<String,Object>的Bean因为根本没有。使用@Resource直接注入的是RedisTemplate)
然后运行代码,我们去看RedisManeger ? 需要我们自己去配置序列化器
7、配置序列化器 – 采用配置类(更多的时候采用这种方法)
@Configuration
public class RedisConfig{
@Bean
public RedisTemplate<String,Object>redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object>template=new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//设置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
//设置value的序列化器
template.setValueSerializer(new StringRedisSerializer());
return template;
}
7、完整例子(将实体类以JSON的形式储存到Redis中)
1、先给出entity(记住实体要序列化一定要实现Serializable接口)
@Data
public class Days implements Serializable {
private String openId;
private String daysId;
//每天的标题
private String title;
//代办事项的数量
private int itemNumber;
//日程
private String date;
}
2、然后在配置类中设置序列化器
@Configuration
public class RedisConfig{
@Bean
public RedisTemplate<String, Days>redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Days>template=new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//设置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
//设置value的序列化器
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Days.class));
return template;
}
}
3、测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate<String,Days> redisTemplate;
private Days d;
@Before
public void before(){
d=new Days();
d.setDate("123");
d.setDaysId("456");
d.setItemNumber(123);
d.setOpenId("dawda");
d.setTitle("title");
}
@Test
public void testSet(){
this.redisTemplate.opsForValue().set("days",d);
System.out.println((redisTemplate.opsForValue().get("days")));
}
}
4、运行结果