springboot整合redis
- 简介
springboot2.x之后原来底层操作redis使用的jedis被替换成了lettuce
jedis:采用直连,多个线程同时操作是不安全的,如果想要避免不安全,就要使用jedis pool连接池,但是比较麻烦,类似BIO模式
lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据,类似NIO模式
- springboot知识回顾
所有的配置类,都有一个自动配置类,自动配置类都会绑定一个properties文件
我们可以找到springboot自动配置类的jar包里的META-INF下的spring.factories文件查看redis自动配置类源码
- 源码简单说明:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")//我们可以自定义一个redisTemplate来替换这个默认的
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//默认的redisTemplate没有过多的设置,注意:redis对象都是需要序列化的
//两个泛型都是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;
}
}
springboot整合redis案例
- 导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置文件
spring:
redis:
host: 192.168.244.129
port: 6379
- 默认api的使用
@SpringBootTest
class RedisSpringboot01ApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
//操作字符串类型对象,其他类型以此类推,工作中不会直接使用原生对象进行操作,一般都会封装一个RedisUtils来使用
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("user1","yl01");
System.out.println(valueOperations.get("user1"));
//获取redis数据库连接,可以通过connection操作数据库,eg:清空数据库
RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
}
@Test
public void test() throws JsonProcessingException {
User user = new User("yl01", 18);
//将对象转成字符串进行传输,如果不转字符串直接进行传输则必须实现序列化接口
String jsonUser=new ObjectMapper().writeValueAsString(user);
redisTemplate.opsForValue().set("user1",jsonUser);
System.out.println(redisTemplate.opsForValue().get("user1"));
}
}
- 自定义redisTemplate
/**
* redis配置类
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();//为了开发方便,一般直接使用<String,Object>
template.setConnectionFactory(redisConnectionFactory);
//json序列化配置
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper=new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//string的序列化
StringRedisSerializer stringRedisSerializer=new StringRedisSerializer();
//key采用string的序列化方式
template.setKeySerializer(stringRedisSerializer);
//hash的key也采用string的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
//value序列化采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
//hash的value序列化采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}