项目场景:
spring boot集成redis
问题描述
使用increment记录数量,调用entries方法反序列化时出错
org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.EOFException at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:42) at org.springframework.data.redis.core.AbstractOperations.deserializeValue(AbstractOperations.java:274)
原因分析:
因为当执行increment方法时,对于入参中的hashVal没有进行序列化,直接调用了redis方法,当获取值时,走了默认的org.springframework.data.redis.serializer.JdkSerializationRedisSerializer,反序列化失败。 解决办法就是将HashValue的序列化方法改为org.springframework.data.redis.serializer.StringRedisSerializer
解决方案:
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
//如果是json格式用下面这个
//redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}