spring数据redis的反序列化问题

xurqigkl  于 2021-06-10  发布在  Redis
关注(0)|答案(1)|浏览(438)

环境:
aix 7.1版
redis 2.6.17版
jdk 1.6版
spring-data-commons-1.12.11.发布
spring-data-keyvalue-1.1.11.释放
spring-data-redis-1.7.11版本
生菜-3.5.0.最终
与web应用程序(redis客户端)在同一主机上运行的redis服务器
问题是:
我已经设置了以下redistemplate bean配置:

@Bean
public RedisTemplate<String, Object> redisTemplate() {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
    redisTemplate.setConnectionFactory(redisConnectionFactory());
    redisTemplate.setEnableTransactionSupport(true);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.sethashKeySerializer(new StringRedisSerializer);
    return redisTemplate;
}

以下是redis服务器验证检查器的代码:

public class ObservableRedisStateChecker implements Runnable {
    ...
    public void run() {
       try {
           Thread.sleep(3000);
           redisTemplate.opfForValue().get("validation");
           notifyObservers(true);
       } catch (Exception e) {
           noifyObservers(false);  // meaning that the Redis' state isn't fine.
       }
    ...
}

上面的observeDisstateChecker会定期检查并通知其他示例redis服务器的状态。代码通常可以正常工作,但当请求过多时,会出现以下错误:

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

奇怪的一点是,当我启动一个简单的测试应用程序,在同一台主机上运行与上述验证代码完全相同的代码时,会发生错误,而当错误发生时,测试应用程序会说没有错误。错误只是发生在web应用程序上。
测试代码如下:

...
ExecutorService es = Executors.newCachedThreadPool()
RedisTemplate<String, Obejct> redisTemplate = ...

es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
...

怎么了?

f8rj6qna

f8rj6qna1#

似乎是序列化问题。
你没有为你的值设置反序列化程序。所以redis使用默认的序列化程序:jdkserializationredisserializer,这一点都不好。我建议使用jackson,或者只是一个stringreserializer。
可能是由于网络问题,它接收到一些不完整的响应,jdk反序列化程序无法识别它并发出投诉。将此添加到配置中
redistemplate.setvalueserializer(new stringredisserializer());
另外,我建议您将代码从
redistemplate.opfforvalue().get(“验证”);

redistemplate.getconnectionfactory().getconnection().ping()
因为后者是为了验证。

相关问题