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

在Scala中使用Redis(绝地武士)线程时遇到问题

齐夕
2023-03-14

我有一个使用线程(实际上是Spark)和Redis(绝地)的Scala程序。我为我的Redis操作定义了一个对象,其中我为连接定义了一个Lazy val。我需要每个线程打开一个到Redis的连接,并与之并行工作
连接对象:

object redisOp{
  lazy val r = new Jedis("127.0.0.1",6379,30)
  def find(u: Long): Option[Long] = Option(r.get(s"p$u")).flatMap(p => if (p.toLong == u) Some(u) else find(p.toLong))
  // and other functions
}

当我用一根线的时候,效果很好。但当多个线程使用它时,我会出错。起初,我在每个线程中得到了Unknown replay:4,其中“4”是一个随机字符(redis.clients.jedis.exceptions.JedisConnectionException:Unknown reply:
然后从redis cli我尝试设置config set timeout 3000030000,因为我也看到了redis。客户。绝地武士。例外。JedisConnectionException:流的意外结束,有时是redis。客户。绝地武士。例外。JedisDataException:错误html" target="_blank">协议错误:日志中的多大容量长度无效。现在在一些运行中(当切换到2个线程而不是4个线程时),程序将永远在一个阶段中运行,不会出错!我查看了Spark UI以查看执行者日志,但找不到任何有用的内容:https://pastebin.com/iJMeBD0D

我认为问题在于定义和使用与Redis的连接。此外,如果需要,请告诉我关闭连接的正确方式。

共有1个答案

郝昊天
2023-03-14

绝地武士的目标不是线程安全的。您应该在多线程环境中使用某种对象/连接池。绝地武士为此提供绝地武士。更多细节可以在绝地维基上找到。

基本思想是通过JedisPool.getResources()获取Jedis对象,并通过Jedis.close()返回该对象。

 类似资料:
  • 根据我的理解,使用JOhm和Jedis,可以在Redis中存储/检索java类对象。我有一个问题是,JOhm是否也将java对象保存在内存中,以便下次需要该对象(与key相关联)时,从内存返回该对象,而不是每次都从Redis读取该对象?

  • 我为数据可视化工具开发了一个插件。现在我想在它里面使用redis。当我在另一个项目(不在我的插件中)中尝试下面的redis代码时,效果很好。 但当我在插件中使用绝地武士时,我得到了由java引起的和错误。为了把我的插件安装到这个数据可视化工具上。我需要创建一个jar文件,我这样做了,它在不添加jedit部分的情况下运行良好。 我正在使用IntelliJ Idea,我创建了一个工件,并从顶部菜单中的

  • 所以,我有两个应用程序使用绝地武士。它们都连接到同一台服务器,其中一个监听发布以检查是否写入了某些内容。好吧,经过大约10个小时的持续使用和装载,设置/获取/发布/订阅等,绝地武士们返回了破碎的管道。我不知道为什么,因为我在绝地武士中有超时到0的时间。有什么想法吗?

  • 我试图从java连接到JedisCluster(ElastiCache Redis)。但是我得到了集群中没有可达节点的JedisConnectionExcema。 这是我连接JedisCluster的代码 运行这个之后我得到的异常 我查过了 正如AWS文件中提到的,我得到的回复是连接的。 这里的问题是什么?为什么我不能使用java连接到JedisCluster? 注: 我用的是jedis版本2.9

  • 我正在使用spring数据雷迪斯与绝地武士。我正在尝试使用键存储哈希。我能成功插入Redis。但是,当我使用redis-cli检查键时,我看不到键。相反,我看到的是。 为什么会发生这种情况?我该如何改变这种情况?

  • 我们的应用程序使用并连接到,以下是我如何获得jedis资源: 这是我的绝地说唱者(统一资源管理): 是Jedis实例的容器,下面是我如何使用它: 请注意,可能非常大(例如可以达到最大8KB)。 每次我重启我们的应用程序,所有的redis连接都是正常的,但是几个小时后,异常出来了。频率变得越来越高,然后所有到Redis的连接都断开了,可以创建新的连接。 以下是我的配置: 异常堆栈跟踪: