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.xml
和 application.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
为我们提供了RedisTemplate
和 StringRedisTemplate
两个模版来进行数据操作, 其中:
StringRedisTemplate
只针对键值都是字符串的数据进行操作.
当我们的数据存储到Redis
的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer
序列化到数据可中的
RedisTemplate 默认使用的是 JdkSerializationRedisSerializer
StringRedisTemplate 默认使用的是 StringRedisSerializer
Spring Data JPA
为我们提供了下面的 Serializer:
- GenericToStringSerializer
- Jackson2JsonRedisSerializer
- JdkSerializationRedisSerializer
- OxmSerializer
- 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;
}
}