【问题标题】:RedisSystemException: java.lang.ClassCastException: [B cannot be cast to java.lang.LongRedisSystemException: java.lang.ClassCastException: [B 不能转换为 java.lang.Long
【发布时间】:2018-11-11 07:36:13
【问题描述】:

我在多线程环境中使用 jedis 和 spring-data-redis 时遇到了这个异常:

org.springframework.data.redis.RedisSystemException: Unknown redis exception; nested exception is java.lang.ClassCastException: [B cannot be cast to java.lang.Long
        at org.springframework.data.redis.FallbackExceptionTranslationStrategy.getFallback(FallbackExceptionTranslationStrategy.java:48)
        at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:38)
        at org.springframework.data.redis.connection.jedis.JedisConnection.convertJedisAccessException(JedisConnection.java:241)
        at org.springframework.data.redis.connection.jedis.JedisConnection.rPush(JedisConnection.java:1705)
        at org.springframework.data.redis.core.DefaultListOperations$14.doInRedis(DefaultListOperations.java:187)
        at org.springframework.data.redis.core.DefaultListOperations$14.doInRedis(DefaultListOperations.java:184)
        at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:207)
        at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:169)
        at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:91)
        at org.springframework.data.redis.core.DefaultListOperations.rightPush(DefaultListOperations.java:184)
        at XXXXXXXXXXXXXXX
Caused by: java.lang.ClassCastException: [B cannot be cast to java.lang.Long
        at redis.clients.jedis.Connection.getIntegerReply(Connection.java:265)
        at redis.clients.jedis.BinaryJedis.rpush(BinaryJedis.java:1053)
        at org.springframework.data.redis.connection.jedis.JedisConnection.rPush(JedisConnection.java:1703)
    ... 19 common frames omitted

jedis 版本:2.9.0

spring-data-redis 版本:1.8.12.RELEASE

redis 服务器版本:3.0.6

我的客户端 Java 代码:

// Init JedisConnectionFactory
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisPoolConfig.setMaxTotal(maxActive);
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxWaitMillis(maxWait);
jedisPoolConfig.setTestOnBorrow(true);

jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setPort(port);
jedisConnectionFactory.setTimeout(timeout);
jedisConnectionFactory.setPassword(password);
jedisConnectionFactory.afterPropertiesSet();

// Create RedisTemplate
redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(jedisConnectionFactory);
redisTemplate.setEnableTransactionSupport(true);
StringRedisSerializer serializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(serializer);
redisTemplate.setValueSerializer(serializer);
redisTemplate.setHashKeySerializer(serializer);
redisTemplate.setHashValueSerializer(serializer);
redisTemplate.afterPropertiesSet();

【问题讨论】:

    标签: redis jedis spring-data-redis


    【解决方案1】:

    在阅读spring-data的源代码后,我终于通过删除这一行解决了我的问题:

    redisTemplate.setEnableTransactionSupport(true);
    

    【讨论】:

      【解决方案2】:

      您应该共享池并在每个线程中从中获取不同的 Jedis。

      GitHub上查看更多信息

      这是Samebug 上的重复模式。试试search with your stack trace

      【讨论】:

      • 我认为jedisConnectionFactory.setPoolConfig(jedisPoolConfig);这一行已经建立了一个绝地共享池。或者你能分享正确的 spring-data-redis 和 jedic 配置代码吗?谢谢
      猜你喜欢
      • 2021-07-21
      • 1970-01-01
      • 2011-06-07
      • 2012-12-10
      • 2016-07-26
      • 2013-08-24
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多