环境:
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));
...
怎么了?
1条答案
按热度按时间f8rj6qna1#
似乎是序列化问题。
你没有为你的值设置反序列化程序。所以redis使用默认的序列化程序:jdkserializationredisserializer,这一点都不好。我建议使用jackson,或者只是一个stringreserializer。
可能是由于网络问题,它接收到一些不完整的响应,jdk反序列化程序无法识别它并发出投诉。将此添加到配置中
redistemplate.setvalueserializer(new stringredisserializer());
另外,我建议您将代码从
redistemplate.opfforvalue().get(“验证”);
到
redistemplate.getconnectionfactory().getconnection().ping()
因为后者是为了验证。