spring数据redis的反序列化问题

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

环境:
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配置:

  1. @Bean
  2. public RedisTemplate<String, Object> redisTemplate() {
  3. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
  4. redisTemplate.setConnectionFactory(redisConnectionFactory());
  5. redisTemplate.setEnableTransactionSupport(true);
  6. redisTemplate.setKeySerializer(new StringRedisSerializer());
  7. redisTemplate.sethashKeySerializer(new StringRedisSerializer);
  8. return redisTemplate;
  9. }

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

  1. public class ObservableRedisStateChecker implements Runnable {
  2. ...
  3. public void run() {
  4. try {
  5. Thread.sleep(3000);
  6. redisTemplate.opfForValue().get("validation");
  7. notifyObservers(true);
  8. } catch (Exception e) {
  9. noifyObservers(false); // meaning that the Redis' state isn't fine.
  10. }
  11. ...
  12. }

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

  1. org.springframework.data.redis.serializer.SerializationException:
  2. Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException:
  3. Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?;
  4. nested exception is java.io.EOFException

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

  1. ...
  2. ExecutorService es = Executors.newCachedThreadPool()
  3. RedisTemplate<String, Obejct> redisTemplate = ...
  4. es.submit(new RedisValidationCheckTest(redisTemplate));
  5. es.submit(new RedisValidationCheckTest(redisTemplate));
  6. es.submit(new RedisValidationCheckTest(redisTemplate));
  7. es.submit(new RedisValidationCheckTest(redisTemplate));
  8. es.submit(new RedisValidationCheckTest(redisTemplate));
  9. es.submit(new RedisValidationCheckTest(redisTemplate));
  10. es.submit(new RedisValidationCheckTest(redisTemplate));
  11. es.submit(new RedisValidationCheckTest(redisTemplate));
  12. es.submit(new RedisValidationCheckTest(redisTemplate));
  13. es.submit(new RedisValidationCheckTest(redisTemplate));
  14. ...

怎么了?

f8rj6qna

f8rj6qna1#

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

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

相关问题