RedisTemplate: Failed to deserialize payload


問題

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)

緣由分析

在使用org.springframework.data.redis.core.RedisTemplate.boundHashOps的increment方法後,調用其entries方法反序列化時出錯。 主要是由於當執行increment方法時,對於入參中的hashVal沒有進行序列化,直接調用了redis方法,當獲取值時,走了默認的org.springframework.data.redis.serializer.JdkSerializationRedisSerializer,反序列化失敗。 解決辦法就是將HashValue的序列化方法改成org.springframework.data.redis.serializer.StringRedisSerializer,問題解決!java

可是也相應的引入新的問題:全部的HashValue都會受到影響,值都必須爲String。所幸Redis底層存儲的值都是字符串,因此也無傷大雅。redis

解決辦法

@Configuration
public class LimitRedisConfig {
    @Bean
    public RedisTemplate<Object, Object> limitRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }
}

tencent.jpg

相關文章
相關標籤/搜索