SpringBoot Redis 乱码
0.问题
使用redis存放键值对时,发现存放的key和value多了 \xac\xed\x00\x05t\x00
的前缀。
1.原因
- 执行了 JdkSerializationRedisSerializer 类中的serialize方法,JDK自带的 ObjectOutPutStream 将我们的String对象序列化成了byte[]
- 不使用这个默认的JDKRedis序列化器
2.解决办法
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int encryptedPort;
@Value("${spring.redis.password}")
private String encryptedPassword;
@Value("${spring.redis.database}")
private int databaseIndex;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();
connectionFactory.setHostName(redisHost);
connectionFactory.setPort(encryptedPort);
connectionFactory.setPassword(encryptedPassword);
connectionFactory.setDatabase(databaseIndex);
return connectionFactory;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
// 创建 CustomRedisTemplate 对象
RedisTemplate<String, String> template = new RedisTemplate<>();
// 配置连接工厂
template.setConnectionFactory(factory);
// 设置 key 序列化方式
Jackson2JsonRedisSerializer<Object> jacksonSeial = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会报异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
StringRedisSerializer stringSerial = new StringRedisSerializer();
// redis key 序列化方式使用stringSerial
template.setKeySerializer(stringSerial);
// redis value 序列化方式使用jackson
template.setValueSerializer(jacksonSeial);
// redis hash key 序列化方式使用stringSerial
template.setHashKeySerializer(stringSerial);
// redis hash value 序列化方式使用jackson
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
}
再使用的类中引入对象
@Autowired
private RedisTemplate<String,String> redisTemplate