当前位置: 首页 > 知识库问答 >
问题:

Spring data redis,Jedis的多线程问题

柳志专
2023-03-14
<bean id="jedisConnFactory"
      class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
      redis:usePool="true" redis:poolConfig-ref="jedisPoolConfig" redis:hostName="${redis.datasource.hostName}"
      redis:database="${redis.database.index}" redis:port="${redis.datastore.port}"/>

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxIdle" value="${redis.conn.maxIdle}"/>
    <property name="maxTotal" value="${redis.conn.maxTotal}"/>
    <property name="minIdle" value="${redis.conn.minIdle}"/>
    <property name="testOnBorrow" value="true"/>
</bean>

<bean id="redisTemplate"
      class="org.springframework.data.redis.core.RedisTemplate"
      redis:connectionFactory-ref="jedisConnFactory"
      redis:keySerializer-ref="redisStringSerializer"
      redis:valueSerializer-ref="redisStringSerializer"
      redis:defaultSerializer-ref="redisStringSerializer"/>

编辑:堆栈跟踪-

Thread 1:
[ERROR] [03/01/2015 07:05:32.044] [events-system-akka.actor.default-dispatcher-2281] [akka://events-system/user/$YN/$b/$b/$b] java.lang.Long cannot be cast to java.util.List
java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.List
    at redis.clients.jedis.Connection.getRawObjectMultiBulkReply(Connection.java:230)
    at redis.clients.jedis.Connection.getObjectMultiBulkReply(Connection.java:236)
    at redis.clients.jedis.BinaryJedis.zscan(BinaryJedis.java:3608)
    at org.springframework.data.redis.connection.jedis.JedisConnection$3.doScan(JedisConnection.java:2998)
    at org.springframework.data.redis.core.KeyBoundCursor.doScan(KeyBoundCursor.java:39)
    at org.springframework.data.redis.core.ScanCursor.scan(ScanCursor.java:85)
    at org.springframework.data.redis.core.ScanCursor.hasNext(ScanCursor.java:168)
    at org.springframework.data.redis.core.ConvertingCursor.hasNext(ConvertingCursor.java:56)
    ...
    application specific stack trace
    ...

Thread 2:    
[ERROR] [03/01/2015 07:03:07.295] [events-system-akka.actor.default-dispatcher-2273] [akka://events-system/user/$VN/$b/$b/$b] Unknown redis exception; nested exception is java.lang.ClassCastException: [B cannot be cast to java.lang.Long
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:195)
    at org.springframework.data.redis.connection.jedis.JedisConnection.zRem(JedisConnection.java:2321)
    at org.springframework.data.redis.core.DefaultZSetOperations$19.doInRedis(DefaultZSetOperations.java:283)
    at org.springframework.data.redis.core.DefaultZSetOperations$19.doInRedis(DefaultZSetOperations.java:280)
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:190)
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:152)
    at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:85)
    at org.springframework.data.redis.core.DefaultZSetOperations.remove(DefaultZSetOperations.java:280)
    ...
    application specific stack trace
    ...
Caused by: java.lang.ClassCastException: [B cannot be cast to java.lang.Long
    at redis.clients.jedis.Connection.getIntegerReply(Connection.java:210)
    at redis.clients.jedis.BinaryJedis.zrem(BinaryJedis.java:1624)
    at org.springframework.data.redis.connection.jedis.JedisConnection.zRem(JedisConnection.java:2319)
    ... 21 more

共有1个答案

颜君浩
2023-03-14

忘了在这里发布更新。

在我的例子中,我的分析是连接池默认使用forkjoinpool,它以工作窃取模式工作。这使得另一个线程接管操作的结果部分,并在结果类型不匹配时提供ClassCastException

这确实解决了我的问题。

 类似资料:
  • 如图所示, 位置 2 和位置3 为什么可以访问 位置1 (也就是主线程)的 point 局部变量 ? 毕竟 位置 2 和位置3 是另外两个线程啊 !! 当我加上 第10行代码后,thread1 和 thead2 中都不能访问主线程中的point 了。我知道这是内部类的“事实最终变量” 的限制。 如下图所示,就是我不理解的地方。(在 “栈内存” 层面) 我的猜测:之所以 thread1 和 trea

  • 1):单线程应用程序只会在用户的CPU上使用1个线程吗?提供更多的线程会使用多个CPU内核吗?如果声明的线程比用户的CPU多,会发生什么?

  • 问题内容: 我有一个使用Redis发布/订阅在Java中使用Jedis客户端在客户端之间传输消息的应用程序。我希望能够在用户键入命令时在运行时订阅频道,但是由于订阅是一个阻塞操作,因为它在调用订阅的线程上进行侦听,所以我不确定以后如何订阅其他频道在原始线程上。 例: 这将起作用,除了调度命令的线程将用于轮询Redis,而我将无法使用该线程订阅更多的频道。 问题答案: 我观察到了同样的问题,即订阅后

  • 前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。 这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有;可能有些问题对应的答案也有;也可能有些各位网友也都看过。但是本文写作的重心就是所

  • 线程2:4 . . 线程3:7 线程3:8 线程1:9 这是我为正在执行线程的类编写的代码 我认为问题在于NumberEntry对象的创建。但我不太确定怎么修好它。如果有人能以任何方式帮助我,那就太好了:)。

  • 互斥锁 互斥锁的本质是当一个 goroutine 访问的时候,其它 goroutine 都不能访问 这样就能实现资源同步,但是在避免资源竞争的同时也降低了程序的并发性能,程序由原来的并发执行变成了串行 案例 有一个打印函数, 用于逐个打印字符串中的字符,有两个人都开启了goroutine去打印 如果没有添加互斥锁,那么两个人都有机会输出自己的内容 如果添加了互斥锁,那么会先输出某一个的,输出完毕之