springboot整合redis

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;
    }

}
记得快乐
原文地址:https://www.cnblogs.com/Y-wee/p/14560768.html