概述
SpringBoot整合Redis通过Spring-Data Redis
说明
在SpringBoot2.x之后,原来使用的Jedis被替换为lettuce。
- jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedis pool连接池!更像BIO模式
- lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了,更像NIO模式。
redis配置文件源码分析
- springboot所有的配置类,都有一个自动配置类
- 自动配置类都会绑定一个properties配置文件
redis的自动配置类和配置属性类
- redis的自动配置类如何查找
先找到springboot通用配置类jar包下的spring.factories文件,该文件里是springboot集成的所有自动配置类
我们找到redis的自动配置类
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
redis的配置文件
配置源码分析
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
) // 我们可以自定义一个redisTemplate来替换这个默认的redisTemplate
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
// 默认的RedisTempalte没有过多的设置,redis对象都是需要序列化的,因此自定义RedisTmeplate需要添加序列化功能。
// RedisTemplat的两个泛型参数都是Object,Object的类型,之后使用需要强转为<String,Object>
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean // 由于String是redis中最常使用的类型,所有说单独提出来一个Bean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
说明
@Bean定义的bean,方法名就是bean id,默认情况下方法名就是bean name。
redis配置项配置
- 所有可用的配置都在redis的配置项类中,里面定义了配置项的前缀和那些配置项可配置。
redis测试
- 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 连接
配置连接
# 我们只需要修改自定义的就可以了,其他的都是默认的,可以不配置
spring.redis.password=123456
- 测试
- 测试类
@SpringBootTest
class DemoApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
// opsForValue 操作字符串,类似String
redisTemplate.opsForValue().set("key1", "hello");
System.out.println(redisTemplate.opsForValue().get("key1"));
}
}
redis 模板引擎
- 对象存储必须序列化或者对象字符串化,否则异常
1、直接存储对象抛出对象无法序列化异常,因为默认使用的jdk序列化,如果不实现serialiable就无法jdk序列化
- 对象实现序列化后,可以正常保存
- 可以自己定义一个redisTemplate,使用其他的序列化方式
- 自定义一个RedisUtils来封装相关的redis API,方法使用。