微服务(六)

微服务(六)

向大佬学习的第六天 2020.5.13

目录

  • 微服务(六)
  • Springboot 整合 Redis
    • 创建项目
    • 问题
    • Redis基础知识

Springboot 整合 Redis

创建项目

  1. 新建springboot项目、导入redis依赖
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 参数配置
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:
    database: 0
  1. 编写测试代码
这里用StringRedisTemplate或RedisTemplate可以快速进行Redis数据库操作。唯一区别就是存储的对象类型
通过opsForValue().set()方法就已经把数据存到Redis了,去Redis管理界面查看就有了。

微服务(六)_第1张图片
微服务(六)_第2张图片

问题

  1. Redis为什么要序列化
    序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。
    通过上面我想你已经知道了凡是需要进行“跨平台存储”和”网络传输”的数据,都需要进行序列化。
    本质上存储和网络传输 都需要经过 把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息。

  2. redis序列化方式对比:
    redis的默认方式是JdkSerializationRedisSerializer
    JdkSerializationRedisSerializer: 使用JDK提供的序列化功能。
    优点是反序列化时不需要提供类型信息(class),但缺点是需要实现Serializable接口,还有序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存。
    Jackson2JsonRedisSerializer: 使用Jackson库将对象序列化为JSON字符串。
    优点是速度快,序列化后的字符串短小精悍,不需要实现Serializable接口。
    但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其只在反序列化过程中用到了类型信息。

  3. 自定义序列化方式为:Jackson2JsonRedisSerializer

@Configuration
public class RedisConfig {
    @Bean
    public RedisRepository redisRepository(RedisTemplate redisTemplate) {
        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        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);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return new RedisRepository(redisTemplate);
    }
}
  1. 在使用RedisTemplate的时候使用注解autowired和resource问题
    微服务(六)_第3张图片
    如果我使用@Resource来注入RedisTemplate的话,它将会按照名称进行装配,于是就会装配默认的JdkSerializationRedisSerializer来进行序列化,我们得到的结果为下图所示
    微服务(六)_第4张图片
    ========分隔线
    微服务(六)_第5张图片
    如果我使用@Autowired来注入RedisTemplate的话,它将会按照类型进行装配,于是就会装配我们自定义的RedisTemplate来进行序列化,我们得到的结果为下图所示
    微服务(六)_第6张图片

Redis基础知识

  1. 数据类型
    五种数据类型:String、hash、list、set、sorted set
    String:二进制类型、最大可存储512MB
    Hash:Sting类型的field和value的映射表,很适合存储对象
    List :按照插入顺序排序,最多可存储2的32次-1个元素
    Set:Sting类型的无序集合,通过哈希表实现,在操作过程中的复杂度为 O(1),集合内元素具有唯一性,第二次插入的元素将被忽略
    Sroted set:不可重复的有序集合、内部用通过seore进行排序

微服务(六)_第7张图片

你可能感兴趣的:(Spring全家桶)