gpt4 book ai didi

Scala Redis 驱动程序 - 使用 blpop 命令

转载 作者:可可西里 更新时间:2023-11-01 11:22:16 24 4
gpt4 key购买 nike

我正在尝试使用 blpop Redis 命令,它将在 10 秒超时后返回一些 Long 值:

 val r = new RedisClient("10.0.0.15", 6379)

implicit val parseV = new com.redis.serialization.Parse[Long](f=>{ByteBuffer.wrap(f).getLong})
val rs = r.blpop[String,Long](10,"queue")
rs match{
case Some(s)=>println(s._2)
case None => println("timeOut");
}

但是在超时时我得到了下面的异常,

有趣的是,如果返回的对象很长,则 byte[] 的大小应为 8 个字节(在 Java 中 long 的长度为 64 位),但如果出现异常,则返回的 byte[] 的长度为 5 个字节.

这是什么?我应该如何注意或防止此异常?这是 StackTrace:

Exception in thread "main" java.nio.BufferUnderflowException
at java.nio.Buffer.nextGetIndex(Buffer.java:498)
at java.nio.HeapByteBuffer.getLong(HeapByteBuffer.java:406)
at com.vanilla.scala.redis.ScalaRedis$$anonfun$1.apply(ScalaRedis.scala:14)
at com.vanilla.scala.redis.ScalaRedis$$anonfun$1.apply(ScalaRedis.scala:13)
at com.redis.serialization.Parse.apply(Serialization.scala:54)
at com.redis.serialization.Parse.apply(Serialization.scala:53)
at scala.Option.map(Option.scala:145)
at com.redis.R$class.asBulk(RedisProtocol.scala:121)
at com.redis.RedisClient.asBulk(RedisClient.scala:60)
at com.redis.StringOperations$$anonfun$get$1.apply(StringOperations.scala:26)
at com.redis.StringOperations$$anonfun$get$1.apply(StringOperations.scala:26)
at com.redis.Redis$class.send(RedisClient.scala:21)
at com.redis.RedisClient.send(RedisClient.scala:60)
at com.redis.StringOperations$class.get(StringOperations.scala:26)
at com.redis.RedisClient.get(RedisClient.scala:60)
at com.vanilla.scala.redis.ScalaRedis$delayedInit$body.apply(ScalaRedis.scala:23)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:71)
at scala.App$$anonfun$main$1.apply(App.scala:71)
at scala.collection.immutable.List.foreach(List.scala:318)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32)
at scala.App$class.main(App.scala:71)
at com.vanilla.scala.redis.ScalaRedis$.main(ScalaRedis.scala:7)
at com.vanilla.scala.redis.ScalaRedis.main(ScalaRedis.scala)

最佳答案

我认为您会收到此异常,因为从 redis 返回的值实际上是 Long 值的字符串表示形式。

看看 Implicit Parser RedisClient 提供的,您会看到它首先构造一个字符串(从 UTF-8 编码的字节),然后调用它的 toLong()。

这也意味着您可以使用此解析器而不是定义您自己的解析器:

val r = new RedisClient("localhost", 6379)

implicit val parseV = com.redis.serialization.Parse.Implicits.parseLong
val rs = r.blpop[String,Long](10,"queue")
rs match{
case Some(s)=>println(s._2)
case None => println("timeOut");
}

关于Scala Redis 驱动程序 - 使用 blpop 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20447628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com