Spring Boot 整合 Redis 并设置序列化类型

1.Spring Boot 整合 Redis

1.1 导入依赖

如果在创建Spring Boot项目的时候需要使用Redis的话, 只需要导入下面一个依赖就可:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

1.2 配置Redis链接属性

配置Redis属性, 用application.xmlapplication.yml都可以, 这里示例使用的是更简洁的application.yml

spring:
  redis:
    host: 127.0.0.1 # redis的ip
    port: 6379  # 端口号
    password: ******    # redis的密码, 如果没有密码可以不配置此项
    database: 0 # redis的index
    timeout: 6000   # 连接redis的超时时间, ms
    jedis:    # jedis连接池配置
      pool:
        min-idle: 5   # 最小空闲连接数
        max-idle: 10  # 最大空闲连接数
        max-active: 15    # 最大活跃连接数
        max-wait: 5000    # 最大阻塞等待时间, ms

1.3 使用

RedisAutoConfiguration为我们默认配置了JedisConnectionFactory, RedisTemplate以及StringRedisTemplate, 让我们可以直接的使用Redis作为数据储存

@Autowired
private RedisTemplate redisTemplate;

@Autowired
private StringRedisTemplate stringRedisTemplate;

String Data Redis为我们提供了RedisTemplateStringRedisTemplate两个模版来进行数据操作, 其中:
StringRedisTemplate只针对键值都是字符串的数据进行操作.
当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据可中的

RedisTemplate 默认使用的是 JdkSerializationRedisSerializer
StringRedisTemplate 默认使用的是 StringRedisSerializer

Spring Data JPA为我们提供了下面的 Serializer:

  1. GenericToStringSerializer
  2. Jackson2JsonRedisSerializer
  3. JdkSerializationRedisSerializer
  4. OxmSerializer
  5. StringRedisSerializer

2.配置 RedisTemplate 序列化类型

Spring Boot为我们自动配置了RedisTemplate, 而RedisTemplate使用的是JdkSerializationRedisSerializer, 这个对我们用redis图形化客户端很不直观, 因为JdkSerializationRedisSerializer使用二进制形式储存数据, 在此我们将自己配置RedisTemplate并定义Serializer

package com.kutesmart.bl.config.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * @author jiangkd
 * @date 2021/2/7 14:24
 */
@Configuration
public class RedisTemplateConfig {

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    /**
     * 注入RedisTemplate<String, Object>
     *
     * @return RedisTemplate
     */
    @Bean("stringObjectRedisTemplate")
    public RedisTemplate<String, Object> redisTemplate() {
        // 创建 redisTemplate 模版
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 关联 redisConnectionFactory
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 序列化格式
        RedisSerializer<String> stringSerializer = redisTemplate.getStringSerializer();
        // 创建序列化器
        Jackson2JsonRedisSerializer<Object> 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);

        // 设置 value 的转化格式和 key 的转化格式
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        return redisTemplate;
    }
}

posted @ 2021-03-26 15:39  KILLNPE  阅读(590)  评论(0编辑  收藏  举报