SpringBoot引入Redis很简单,添加以下注解:

SpringBoot配置Redis序列化规则,防止乱码_程序人生

然后在application.yml中添加Redis配置:

SpringBoot配置Redis序列化规则,防止乱码_面试_02


注:此处有一些额外的配置,比如password等,我这里为省事就不写了。


下面我们可以编写测试类了:

SpringBoot配置Redis序列化规则,防止乱码_java_03

测试后发现一个问题,test:1这样的key,乱码了。比如我用

Another.Redis.Desktop.Manager工具去查看时,发现变成了一串奇奇怪怪的字符串。

乱码了。

这是因为Redis默认序列化规则导致的。RedisTemplate默认的所有序列化规则都是JDKSerializer,而StringRedisTemplate默认的序列化规则是StringRedisSerializer。具体可以看下图:

SpringBoot配置Redis序列化规则,防止乱码_面试_04

SpringBoot配置Redis序列化规则,防止乱码_程序员_05

我们需要对它进行配置:

package com.eknown.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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.StringRedisSerializer;

/**
* redis配置
* 主要是配置Redis的序列化规则,用Jackson2JsonRedisSerializer替换默认的jdkSerializer
* @author zhangfanghao
* @version 1.0
* @date 2019-07-21 21:04
*/
@Configuration
public class RedisConfig {


@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);

// 使用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);

// 设置key和value的序列化规则
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();

return redisTemplate;
}
}

注:此处仅重新设置了Key和Value的序列化规则,hash-key和hash-value的序列化规则可以参考进行设置。