微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Springboot整合Redis学习

Springboot整合Redis学习

在 SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce?

jedis : 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接池! 更像 BIO 模式

lettuce : 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了,更像 NIO 模式

在这里插入图片描述

在这里插入图片描述

源码分析:

@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean(name = "redistemplate")
	public Redistemplate<Object, Object> redistemplate(RedisConnectionFactory redisConnectionFactory)
			throws UnkNownHostException {
		Redistemplate<Object, Object> template = new Redistemplate<>();
		template.setConnectionFactory(redisConnectionFactory);
		return template;
	}

	@Bean
	@ConditionalOnMissingBean
	public StringRedistemplate stringRedistemplate(RedisConnectionFactory redisConnectionFactory)
			throws UnkNownHostException {
		StringRedistemplate template = new StringRedistemplate();
		template.setConnectionFactory(redisConnectionFactory);
		return template;
	}

}

1.Maven依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--redis相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.application.yml

spring:
  redis:
    port: 6379
    host: 127.0.0.1
    database: 1

3.测试类

@RunWith(springrunner.class)
@SpringBoottest(classes = UserApplication.class)
public class RedisTest {

    @Autowired
     Redistemplate redistemplate;

    @Test
    public void redistest(){
        redistemplate.opsForValue().set("name","张三");
        System.out.println(redistemplate.opsForValue().get("name"));
    }

    @Test
    public void delRedis(){
        redistemplate.delete("name");
        System.out.println(redistemplate.opsForValue().get("name"));
    }
}

此时我们回到Redis查看数据时候,惊奇发现全是乱码,可是程序中可以正常输出。这时候就关系到存储对象的序列化问题,在网络中传输的对象也是一样需要序列化,否者就全是乱码。

解决方

@Configuration
public class RedisConfig {

    @Bean
    @SuppressWarnings("all")
    public Redistemplate<String,Object>redistemplate(RedisConnectionFactory factory){
        // 我们为了自己开发方便,一般直接使用 <String, Object>
        Redistemplate<String, Object> template = new Redistemplate<String,
                Object>();
        template.setConnectionFactory(factory);

        // Json序列化配置
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
                Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setobjectMapper(om);
        // 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;
    }
}

相关博客链接

狂神redis笔记

redis工具类

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐