debasishg / scala-redis Goto Github PK
View Code? Open in Web Editor NEWThis project forked from acrosa/scala-redis
A scala library for connecting to a redis server, or a cluster of redis nodes using consistent hashing on the client side.
This project forked from acrosa/scala-redis
A scala library for connecting to a redis server, or a cluster of redis nodes using consistent hashing on the client side.
I try to receive some pmessage from redis, but couldn't message.
val client = new RedisClient("localhost", 6379)
client.pSubscribe("*") { pubsub => println(pubsub) }
results:
S(*,1)
I'm using a redis version 2.4.17.
Please, add support of STORE option for SORT command.
When redis server is down, PubSub throws RedisConnectionException which crashes Consumer. There is no way for application to handle it, trigger recovery or do something. A graceful handling could be considered there, like listener for application so that application can do something.
Hi,
I find there is a bug in Redis.send method. Steps to reproduce:
This issue only occurs on the first message after timeout.
To fix it:
add "case e: SocketException" in Redis.send method with the same exception handling in RedisConnectionException
Has it not been implemented yet or intended to not be supported at all?
Hello!
I have lua script that works well in redis-cli, but return error:
Protocol error: Got (*,[B@db75d45) as initial reply byte
, when I try to execute it with evalMultiBulk.
redis-cli:
eval "local ids = redis.call('SORT', 'users', 'ALPHA', 'BY', 'user:*->name'); local result = {}; for index, value in ipairs(ids) do table.insert(result, redis.call('hgetall', 'user:'..value)); end return result;" 0
scala-redis:
r.evalMultiBulk("local ids = redis.call('SORT', 'users', 'ALPHA', 'BY', 'user:*->name'); local result = {}; for index, value in ipairs(ids) do table.insert(result, redis.call('hgetall', 'user:'..value)); end return result;", List.empty, List.empty)
What is a preferable logic to detect connection lost and reconnect to server?
It seems connected and connect methods aren't working as I expect. Surprisingly, select method works and reconnects to server.
How do I check if connection to server has been lost?
Currently scala-redis only returns a single random element of a set. Can you add support for an optional count, as described here http://redis.io/commands/srandmember?
SRANDMEMBER key [count]
Thanks!
I was running my Spark application on LINUX OS. But It was stopped after running some time, and I again ran the application, now its working fine. Could you any one please let me know the reason why the application stopped.
Regards to the documentation, Redis has a transactions support http://redis.io/topics/transactions, how can it be used using the driver?
It seems is some cases https://github.com/debasishg/scala-redis/blob/master/src/main/scala/com/redis/RedisProtocol.scala#L68 can produce a null, don't know whether it means that there is no such a key, or whether it is a bug.
Hi @debasishg ,
I'm using RedisClientPool to access my redis server which has a config timeout set to 300. And after some period of inactivities, the subsequent requests to redis got hang. But when timeout was set to 0, everything went fine and the problem didn't occur.
I believe that is caused by RedisClientPool not awaring of server closed connections in case of timeouts.
And I'm using redisclient_2.9.1-2.5.jar and my code is as following:
val pool = new RedisClientPool(redisHost,redisPort)
pool.withClient{
client =>
client.hget(key,field)
}
Am I missing something?
override def rpush(key: Any, value: Any, values: Any_)(implicit format: Format) = processForKey(key)(_.lpush(key, value, values:__))
should be
override def rpush(key: Any, value: Any, values: Any_)(implicit format: Format) = processForKey(key)(_.rpush(key, value, values:__))
Hi,
Currently every command result is Option[T]
even if the command always return some value, so we always need to use match
or .get
.
As using new akka IO having Future
, I suggest using Promise.failure
when error occurs and giving Option
only when necessary to keep the API simple.
What are your thoughts?
Redis supports master slave configurations and manual failover. Unfortunately, automated failover is unlikely to be added until the RedisCluster project is live for a while. In the meantime, one great solution is the redis_failover gem -> https://github.com/ryanlecompte/redis_failover - this adds a zookeeper backed redis node manager that can automate the slave failover in the event of a node going down. This did require some additional client work, as redis_failover includes a client with some 'smarts' to take advantage of the high-availability features. Would supporting a failover framework like this be something within the scope of scala-redis?
Based on your Test example PubSubServerDemo.scala to subscribe to a keyword, we used it in Spark Streaming.
When we subscribe as sub("UPDATED_KEYWORD"), we are getting the message,
subscribed to UPDATED_KEYWORD and count = 1
but as soon as we publish through redis client, as <publish "UPDATED_KEYWORD" "TRUE"> we get an exception,
Fatal error caused consumer dead. Please init new consumer reconnecting to master or connect to backup java.lang.NullPointerException
We are using java 1.6, scala 1.9.3 and built your version with scala 1.9.3.
Akka jars that we are using: akka-actor-2.0.3.jar, akka-remote-2.0.3.jar, akka-slf4j-2.0.3.jar, akka-zeromq-2.0.3.jar
Are we doing something wrong ?
Please let me know if you need any more information from my side.
I'm using Scala 10 with Java 1.7 and am receiving this error -
"Error in Scala compiler: bad symbolic reference. A signature in Log.class refers to term slf4j in package org which is not available. It may be completely missing from the current classpath, or the version on the classpath might be incompatible with the version used when compiling Log.class. HelloRedis Unknown Scala Problem"
Please advice.
Thanks.
It would be great to have ability to set connection timeout.
For instance it would be handy for hostname resolution problems(on my host almost 1 minute till java.net.ConnectException thrown). Try yourself:
new RedisClientPool("nonexistent", 6378)
So this happens when i want to use mget to get a list of keys
scala> val k=Seq("a","b","c")
k: Seq[String] = List(a, b, c)
It only works as follows
scala> r.mget(Nil,k:_*)
res11: Option[List[Option[String]]] = Some(List(None, Some(3), Some(2), Some(1)))
I tried mget with just taking the second parameter but the console throws out errors.
My question is why mget need two parameters? (key is a key and keys as vararg)
The implementation seems to prepend key to keys anyway...
Any plan to add Scala 2.10.0-RC1 support?
I've tried to use
"net.debasishg" % "redisclient_2.9.2" % "2.7"
but I get
java.lang.NoClassDefFoundError: scala/reflect/ClassManifest
at com.redis.RedisClient.<init>(RedisClient.scala:53)
error at runtime.
Hi, I follow the PubSubServer.scala, I divide Subscriber and Publisher to two individual classes,
but in the Sub.scala (object Sub), like below:
...................
object Sub {
val actorSystem = ActorSystem("PubSubActorSystem")
println("starting subscription service...")
var r = new RedisClient("localhost",6379)
var s = actorSystem.actorOf(Props(new Subscriber(r)))
^
this line have strange error:
"overloaded method value apply with alternatives: (creator: () => akka.actor.Actor,dispatcher: String,routerConfig: akka.routing.RouterConfig,deploy: akka.actor.Deploy)akka.actor.Props (behavior: akka.actor.ActorContext => akka.actor.Actor.Receive)akka.actor.Props (creator: akka.japi.Creator[_ <: akka.actor.Actor])akka.actor.Props (creator: => akka.actor.Actor)akka.actor.Props (actorClass: Class[_ <: akka.actor.Actor])akka.actor.Props [T <: akka.actor.Actor](implicit evidence$1: ClassManifest[T])akka.actor.Props cannot be applied to (org.sample.pubsub.Subscriber) Sub.scala /pub_sub_scala/src/org/sample/pubsub line 12 Scala Problem"
.................
Anyone know what's happened?
sorry for the mess, hope someone can help me
Thank you for your time!
In my some other project, is it possible to include
import com.redis._
to use this package?
With other libraries, I just add a line to the dependency list in my build.sbt.
For example, installing https://github.com/scalaj/scalaj-http, I just add
"org.scalaj" %% "scalaj-http" % "0.3.7"
to the dependency.
How do I do this for scala-redis?
Thank you very much
yves
Play 2.1 uses Ehcache by default.
It seems that scala-redis acts as a standalone module and doesn't implement Play's default CacheAPI interface. Any idea how it might be done to use it seamlessly with Play?
sorry, me again...
I follow the code in your "akka-redis-pubsub", and everything seems fine, but when I try to run the eclipse project, the IDE told me that I have some error. here is the message in Markers :
The SBT builder crashed while compiling your project. This is a bug in the Scala compiler or SBT. Check the Erorr Log for details. The error message is: null pub_sub_scala Unknown Scala Problem
and the Error Log is below :
null
Error
Mon Aug 20 14:24:00 CST 2012
java.lang.Error
at scala.tools.nsc.symtab.SymbolTable.abort(SymbolTable.scala:35)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:737)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedApply$1$1.apply(Typers.scala:3355)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedApply$1$1.apply(Typers.scala:3355)
at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:624)
at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:3355)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:4106)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:731)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:2100)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$24.apply(Typers.scala:2184)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$24.apply(Typers.scala:2184)
at scala.collection.immutable.List.loop$1(List.scala:148)
at scala.collection.immutable.List.mapConserve(List.scala:164)
at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:2184)
at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:1919)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3953)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:731)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4346)
at scala.tools.nsc.typechecker.Typers$Typer.typedIf$1(Typers.scala:3160)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3989)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:731)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:1920)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3953)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:731)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer.transformedOrTyped(Typers.scala:4430)
at scala.tools.nsc.typechecker.Typers$Typer.typedDefDef(Typers.scala:1760)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3921)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:731)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:2100)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$24.apply(Typers.scala:2184)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$24.apply(Typers.scala:2184)
at scala.collection.immutable.List.loop$1(List.scala:148)
at scala.collection.immutable.List.mapConserve(List.scala:164)
at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:2184)
at scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:1512)
at scala.tools.nsc.typechecker.Typers$Typer.typedClassDef(Typers.scala:1278)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3912)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:731)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:2100)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$24.apply(Typers.scala:2184)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$24.apply(Typers.scala:2184)
at scala.collection.immutable.List.loop$1(List.scala:148)
at scala.collection.immutable.List.mapConserve(List.scala:164)
at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:2184)
at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:1919)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3953)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:731)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer.transformedOrTyped(Typers.scala:4430)
at scala.tools.nsc.typechecker.Typers$Typer.typedDefDef(Typers.scala:1760)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3921)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:731)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:2100)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$24.apply(Typers.scala:2184)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$24.apply(Typers.scala:2184)
at scala.collection.immutable.List.loop$1(List.scala:148)
at scala.collection.immutable.List.mapConserve(List.scala:164)
at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:2184)
at scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:1512)
at scala.tools.nsc.typechecker.Typers$Typer.typedClassDef(Typers.scala:1278)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3912)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:731)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:2100)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$24.apply(Typers.scala:2184)
at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$24.apply(Typers.scala:2184)
at scala.collection.immutable.List.loop$1(List.scala:148)
at scala.collection.immutable.List.mapConserve(List.scala:164)
at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:2184)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3908)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:731)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4273)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4333)
at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anonfun$transform$1.apply(Erasure.scala:1182)
at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anonfun$transform$1.apply(Erasure.scala:1177)
at scala.tools.nsc.symtab.SymbolTable.atPhase(SymbolTable.scala:95)
at scala.tools.nsc.transform.Erasure$ErasureTransformer.transform(Erasure.scala:1177)
at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:892)
at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:30)
at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:329)
at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:297)
at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:297)
at scala.collection.Iterator$class.foreach(Iterator.scala:772)
at scala.collection.mutable.ListBuffer$$anon$1.foreach(ListBuffer.scala:318)
at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:297)
at scala.tools.nsc.Global$Run.compileSources(Global.scala:953)
at scala.tools.nsc.Global$Run.compile(Global.scala:1041)
at xsbt.CompilerInterface.run(CompilerInterface.scala:106)
at scala.tools.eclipse.buildmanager.sbtintegration.ScalaSbtCompiler.compile(ScalaSbtCompiler.scala:46)
at scala.tools.eclipse.buildmanager.sbtintegration.AnalysisCompile$$anonfun$6.compileScala$1(AnalysisCompile.scala:94)
at scala.tools.eclipse.buildmanager.sbtintegration.AnalysisCompile$$anonfun$6.apply(AnalysisCompile.scala:130)
at scala.tools.eclipse.buildmanager.sbtintegration.AnalysisCompile$$anonfun$6.apply(AnalysisCompile.scala:72)
at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:21)
at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:19)
at sbt.inc.Incremental$.cycle(Incremental.scala:33)
at sbt.inc.Incremental$.compile(Incremental.scala:20)
at sbt.inc.IncrementalCompile$.apply(Compile.scala:17)
at scala.tools.eclipse.buildmanager.sbtintegration.AnalysisCompile.doCompile(AnalysisCompile.scala:148)
at scala.tools.eclipse.buildmanager.sbtintegration.EclipseSbtBuildManager.runCompiler(EclipseSbtBuildManager.scala:178)
at scala.tools.eclipse.buildmanager.sbtintegration.EclipseSbtBuildManager.update(EclipseSbtBuildManager.scala:141)
at scala.tools.eclipse.buildmanager.sbtintegration.EclipseSbtBuildManager.build(EclipseSbtBuildManager.scala:241)
at scala.tools.eclipse.ScalaProject.build(ScalaProject.scala:579)
at scala.tools.eclipse.ScalaBuilder.build(ScalaBuilder.scala:114)
at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:728)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:239)
at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:292)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:295)
at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:351)
at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:374)
at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:143)
at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:241)
I think that maybe have something to do with RedisClient, cause when I deleted client.publish(channel,message), then the error disappeared
I don't know what happened and how could I fix this problem...
my code is here:
https://www.dropbox.com/sh/dp6hu5el96ofv6d/YJaFRKGXIa/Akka_scala_subpub
Thank you for your time, hope you can figure this out
I found out that redis client doesn't accept urls like this:
redis://redistogo:[email protected]
Even when I do the following:
val redis = new RedisClient("redis://redistogo:[email protected]", "10119")
It says:
java.lang.RuntimeException: java.net.UnknownHostException:
Looks like the following class which utilizes Subscriber is causing deadLetters warnings:
https://gist.github.com/stevef/7001569
Seems it's happening because of the return value here - https://github.com/debasishg/scala-redis/blob/master/src/main/scala/com/redis/PubSubServer.scala#L22
There an appropriate way of handling the return message in my client to avoid receiving deadLetters?
Any chance of a 2.11 rc3 snapshot build?
Tis a dependency for me doing a 2.11 release of one of my projects.
When using redisCluster with a list of non-local node, rediscluster will still try and connect locally.
val redisCluster = new RedisCluster(Seq("192.168.0.1:6379"): _*) { val keyTag: Option[KeyTag] = Some(NoOpKeyTag) }
Running the above code without a localhost:6379 listener will fail:
java.lang.RuntimeException: java.net.ConnectException: Connection refused
at com.redis.IO$class.connect(IO.scala:37) ~[redisclient_2.9.1-2.4.2.jar:na]
at com.redis.RedisClient.connect(RedisClient.scala:41) ~[redisclient_2.9.1-2.4.2.jar:na]
at com.redis.RedisClient.<init>(RedisClient.scala:44) ~[redisclient_2.9.1-2.4.2.jar:na]
at com.redis.RedisClient.<init>(RedisClient.scala:46) ~[redisclient_2.9.1-2.4.2.jar:na]
at com.redis.cluster.RedisCluster.<init>(RedisCluster.scala:59) ~[redisclient_2.9.1-2.4.2.jar:na]
Possibly because of this
def this() = this("localhost", 6379)
Hello, can I build the jar file for this library for scala 2.10.2? I tried with "sbt package" but it runs into some issues, namely something like:
java.lang.NoClassDefFoundError: scala/reflect/internal/Trees
I looked up in the internet and they are saying are problems with the idea editor, but I'm not really using it, I've just cloned the library and made sbt package in the main folder.
Thank You for this library, it's very nice :)
Hello, I wonder if is possible to pass instances of RedisClient with case classes, because I get a strange error when I try to use it, something like "wrong parameter" ?
Hi,
Thanks a lot for redisclient.
I can do a sbt build with
"net.debasishg" %% "redisclient" % "2.11"
but cannot with
"net.debasishg" %% "redisclient" % "2.12"
Results in
module not found: net.debasishg#redisclient_2.10;2.12
Is it available in a particular repository other than Typesafe(repo.typesafe.com), Sonatype(oss.sanatype.org) or Maven(repo1.maven.org)?
Thanks again.
as title, I can't use RedisClient as you did in Readme
it says "not found: type RedisClient", but I did import com.redis
it would be very appreciate if you can help
thanks!
In my SampleTest application, I design the code like after receiving new search pattern from the client the StreamingContext should be stoped (ssc.stop()) and again start with the newly assigned pattern ( ssc.start() ).
Stoping the StreamingContext (ssc.stop() ) is fine but, while starting the StreamingContext (ssc.start() ) it will through the akka.pattern.AskTimeoutException: sending to terminated ref breaks promises exception. I would also want to know why this exception occurs in the code.
Let me know if required any additional information regarding to this problem.
In Operations
:
def expire(key: Any, expiry: Int)(implicit format: Format): Boolean =
send("EXPIRE", List(key, expiry))(asBoolean)
and in StringOperations
:
def expire(key: Any, ttl: Any)(implicit format: Format): Boolean =
send("EXPIRE", List(key,ttl))(asBoolean)
I think i put it in the wrong place originally,
acrosa#14
If I try
val redisClient = RedisClient(endpoint)
redisClient.auth("pwd")
I get an exception
at akka.pattern.AskableActorRef$.ask$extension(AskSupport.scala:136)
at com.redis.api.KeyOperations$class.auth(KeyOperations.scala:112)
at com.redis.api.RedisOps.auth(RedisOps.scala:7)
My understanding is that RedisClient is not thread safe (it would be bad to instantiate one instance of RedisClient and use it in multiple akka actors). Can you confirm?
So I would have two choices:
The latter is almost definitely desirable because then I don't have to have one open connection for each of my hundreds of actors.
Based on http://redis.io/commands/hset, the return value of hset should be Option[Int].
Code that causes it (from time to time) is redis.setex(k: String, timeout: Int, value: Array[Byte]). In IO#readLine(), the 'build' length grows infinitely. I believe setex() is only expecting a boolean to be read off the wire.
My temporary workaround is to return null from readLine() if the builder gets over 100KB.
java.lang.OutOfMemoryError: Java heap space
at scala.collection.mutable.ArrayBuilder$ofByte.mkArray(ArrayBuilder.scala:115)
at scala.collection.mutable.ArrayBuilder$ofByte.resize(ArrayBuilder.scala:121)
at scala.collection.mutable.ArrayBuilder$ofByte.ensureSize(ArrayBuilder.scala:133)
at scala.collection.mutable.ArrayBuilder$ofByte.$plus$eq(ArrayBuilder.scala:138)
at com.redis.IO$class.readLine(IO.scala:97)
at com.redis.RedisClient.readLine(RedisClient.scala:41)
at com.redis.Reply$class.receive(RedisProtocol.scala:101)
at com.redis.RedisClient.receive(RedisClient.scala:41)
at com.redis.R$class.asBoolean(RedisProtocol.scala:116)
at com.redis.RedisClient.asBoolean(RedisClient.scala:41)
at com.redis.StringOperations$$anonfun$setex$1.apply$mcZ$sp(StringOperations.scala:28)
at com.redis.StringOperations$$anonfun$setex$1.apply(StringOperations.scala:28)
at com.redis.StringOperations$$anonfun$setex$1.apply(StringOperations.scala:28)
at com.redis.Redis$class.send(RedisClient.scala:19)
at com.redis.RedisClient.send(RedisClient.scala:41)
at com.redis.StringOperations$class.setex(StringOperations.scala:28)
at com.redis.RedisClient.setex(RedisClient.scala:41)
The code for llen
returns a Long
, but the arguments for lrange
are Int
.
This means that if you query for the length of a list, it is possible that you will get
a value that cannot, in turn, be passed to lrange
. This doesn't seem logical to
me.
If, in fact, Redis indices can be longs, then lrange
(and probably some others) should take Long as their argument type. If Redis indices are restricted to Int
then llen
should return that. What we have now is some kind of odd in-between.
Or am I missing something?
Hi,
I got a very strange error when I use RedisCluster. It works well generally. When it takes requests from multiple threads, I got
Protocol error: Got (O,[B@1f639d92) as initial reply byte
However, if I change nodes to localhost on different ports, it works well again. Very confusing. Does anyone see this before?
Thanks
SMEMBERS, SINTER, SUNION and SDIFF returns empty Set even if Set(or Sets) does not exists. So I think they should return Set[Option[A]] instead of Option[Set[Option[A]]].
What is more Set items can not be "null", so I think all this operations should return just Set[A] instead of Option[Set[Option[A]]].
All operations that returns Option[Long] should return Long, because they always return Number of affected elements or "0".
Sorry if I'm wrong and correct me, please.
The issue is if one node is down and I can't find a way to replace the problem node. The solution from https://github.com/youngking/redis-shard is quite good. Only node id/name is coupled with hash ring order. If the master is down, slave can be used to replace master without changing hash ring order.
I guess the quickest fix could be:
What do you think?
Starting with Redis 2.6.12 SET supports a set of options that modify its behavior:
EX seconds -- Set the specified expire time, in seconds.
PX milliseconds -- Set the specified expire time, in milliseconds.
NX -- Only set the key if it does not already exist.
XX -- Only set the key if it already exist.
Note: Since the SET command options can replace SETNX, SETEX, PSETEX, it is possible that in future versions of Redis these three commands will be deprecated and finally removed.
Hello, i've just cloned the project and did "$ sbt", and the next exception appeared:
Mardos-MacBook-Pro:scala-redis mardo$ sbt
[info] Loading global plugins from /Users/mardo/.sbt/plugins
[info] Updating {file:/Users/mardo/.sbt/plugins/}default-462dc6...
[info] Resolving com.typesafe.startscript#xsbt-start-script-plugin;0.5.2 ...
[warn] module not found: com.typesafe.startscript#xsbt-start-script-plugin;0.5.2
[warn] ==== typesafe-ivy-releases: tried
[warn] http://repo.typesafe.com/typesafe/ivy-releases/com.typesafe.startscript/xsbt-start-script-plugin/scala_2.9.2/sbt_0.12/0.5.2/ivys/ivy.xml
[warn] ==== sbt-plugin-releases: tried
[warn] http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/com.typesafe.startscript/xsbt-start-script-plugin/scala_2.9.2/sbt_0.12/0.5.2/ivys/ivy.xml
[warn] ==== local: tried
[warn] /Users/mardo/.ivy2/local/com.typesafe.startscript/xsbt-start-script-plugin/scala_2.9.2/sbt_0.12/0.5.2/ivys/ivy.xml
[warn] ==== typesafe-ivy-releases: tried
[warn] http://repo.typesafe.com/typesafe/ivy-releases/com.typesafe.startscript/xsbt-start-script-plugin/scala_2.9.2/sbt_0.12/0.5.2/ivys/ivy.xml
[warn] ==== public: tried
[warn] http://repo1.maven.org/maven2/com/typesafe/startscript/xsbt-start-script-plugin_2.9.2_0.12/0.5.2/xsbt-start-script-plugin-0.5.2.pom
[info] Resolving org.scala-sbt#sbt;0.12.0 ...
[info] Resolving org.scala-sbt#main;0.12.0 ...
[info] Resolving org.scala-sbt#actions;0.12.0 ...
[info] Resolving org.scala-sbt#classpath;0.12.0 ...
[info] Resolving org.scala-sbt#launcher-interface;0.12.0 ...
[info] Resolving org.scala-lang#scala-library;2.9.2 ...
[info] Resolving org.scala-sbt#interface;0.12.0 ...
[info] Resolving org.scala-sbt#io;0.12.0 ...
[info] Resolving org.scala-sbt#control;0.12.0 ...
[info] Resolving org.scala-lang#scala-compiler;2.9.2 ...
[info] Resolving org.scala-sbt#completion;0.12.0 ...
[info] Resolving org.scala-sbt#collections;0.12.0 ...
[info] Resolving jline#jline;1.0 ...
[info] Resolving org.scala-sbt#api;0.12.0 ...
[info] Resolving org.scala-sbt#compiler-integration;0.12.0 ...
[info] Resolving org.scala-sbt#incremental-compiler;0.12.0 ...
[info] Resolving org.scala-sbt#logging;0.12.0 ...
[info] Resolving org.scala-sbt#process;0.12.0 ...
[info] Resolving org.scala-sbt#compile;0.12.0 ...
[info] Resolving org.scala-sbt#persist;0.12.0 ...
[info] Resolving org.scala-tools.sbinary#sbinary_2.9.0;0.4.0 ...
[info] Resolving org.scala-sbt#classfile;0.12.0 ...
[info] Resolving org.scala-sbt#compiler-ivy-integration;0.12.0 ...
[info] Resolving org.scala-sbt#ivy;0.12.0 ...
[info] Resolving org.apache.ivy#ivy;2.3.0-rc1 ...
[info] Resolving com.jcraft#jsch;0.1.46 ...
[info] Resolving commons-httpclient#commons-httpclient;3.1 ...
[info] Resolving commons-logging#commons-logging;1.0.4 ...
[info] Resolving commons-codec#commons-codec;1.2 ...
[info] Resolving org.scala-sbt#run;0.12.0 ...
[info] Resolving org.scala-sbt#task-system;0.12.0 ...
[info] Resolving org.scala-sbt#tasks;0.12.0 ...
[info] Resolving org.scala-sbt#tracking;0.12.0 ...
[info] Resolving org.scala-sbt#cache;0.12.0 ...
[info] Resolving org.scala-sbt#testing;0.12.0 ...
[info] Resolving org.scala-sbt#test-agent;0.12.0 ...
[info] Resolving org.scala-tools.testing#test-interface;0.5 ...
[info] Resolving org.scala-sbt#command;0.12.0 ...
[info] Resolving org.scala-sbt#compiler-interface;0.12.0 ...
[info] Resolving org.scala-sbt#precompiled-2_8_2;0.12.0 ...
[info] Resolving org.scala-sbt#precompiled-2_10_0-m4;0.12.0 ...
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: UNRESOLVED DEPENDENCIES ::
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: com.typesafe.startscript#xsbt-start-script-plugin;0.5.2: not found
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn]
[warn] Note: Some unresolved dependencies have extra attributes. Check that these dependencies exist with the requested attributes.
[warn] com.typesafe.startscript:xsbt-start-script-plugin:0.5.2 (sbtVersion=0.12, scalaVersion=2.9.2)
[warn]
sbt.ResolveException: unresolved dependency: com.typesafe.startscript#xsbt-start-script-plugin;0.5.2: not found
at sbt.IvyActions$.sbt$IvyActions$$resolve(IvyActions.scala:211)
at sbt.IvyActions$$anonfun$update$1.apply(IvyActions.scala:122)
at sbt.IvyActions$$anonfun$update$1.apply(IvyActions.scala:121)
at sbt.IvySbt$Module$$anonfun$withModule$1.apply(Ivy.scala:114)
at sbt.IvySbt$Module$$anonfun$withModule$1.apply(Ivy.scala:114)
at sbt.IvySbt$$anonfun$withIvy$1.apply(Ivy.scala:102)
at sbt.IvySbt.liftedTree1$1(Ivy.scala:49)
at sbt.IvySbt.action$1(Ivy.scala:49)
at sbt.IvySbt$$anon$3.call(Ivy.scala:58)
at xsbt.boot.Locks$GlobalLock.withChannel$1(Locks.scala:75)
at xsbt.boot.Locks$GlobalLock.withChannelRetries$1(Locks.scala:58)
at xsbt.boot.Locks$GlobalLock$$anonfun$withFileLock$1.apply(Locks.scala:79)
at xsbt.boot.Using$.withResource(Using.scala:11)
at xsbt.boot.Using$.apply(Using.scala:10)
at xsbt.boot.Locks$GlobalLock.liftedTree1$1(Locks.scala:51)
at xsbt.boot.Locks$GlobalLock.withLock(Locks.scala:51)
at xsbt.boot.Locks$.apply0(Locks.scala:30)
at xsbt.boot.Locks$.apply(Locks.scala:27)
at sbt.IvySbt.withDefaultLogger(Ivy.scala:58)
at sbt.IvySbt.withIvy(Ivy.scala:99)
at sbt.IvySbt.withIvy(Ivy.scala:95)
at sbt.IvySbt$Module.withModule(Ivy.scala:114)
at sbt.IvyActions$.update(IvyActions.scala:121)
at sbt.Classpaths$$anonfun$work$1$1.apply(Defaults.scala:949)
at sbt.Classpaths$$anonfun$work$1$1.apply(Defaults.scala:947)
at sbt.Classpaths$$anonfun$doWork$1$1$$anonfun$54.apply(Defaults.scala:970)
at sbt.Classpaths$$anonfun$doWork$1$1$$anonfun$54.apply(Defaults.scala:968)
at sbt.Tracked$$anonfun$lastOutput$1.apply(Tracked.scala:35)
at sbt.Classpaths$$anonfun$doWork$1$1.apply(Defaults.scala:972)
at sbt.Classpaths$$anonfun$doWork$1$1.apply(Defaults.scala:967)
at sbt.Tracked$$anonfun$inputChanged$1.apply(Tracked.scala:45)
at sbt.Classpaths$.cachedUpdate(Defaults.scala:975)
at sbt.Classpaths$$anonfun$45.apply(Defaults.scala:855)
at sbt.Classpaths$$anonfun$45.apply(Defaults.scala:852)
at sbt.Scoped$$anonfun$hf10$1.apply(Structure.scala:586)
at sbt.Scoped$$anonfun$hf10$1.apply(Structure.scala:586)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:49)
at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$12.apply(Structure.scala:311)
at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$12.apply(Structure.scala:311)
at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
at sbt.std.Transform$$anon$5.work(System.scala:71)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:232)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:232)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
at sbt.Execute.work(Execute.scala:238)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:232)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:232)
at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
error sbt.ResolveException: unresolved dependency: com.typesafe.startscript#xsbt-start-script-plugin;0.5.2: not found
A build of this lib with current akka-actor lib would help me out alot, trying to upgrade from akka1.3.1 on scala 2.9.2 to current akka 2.1.0 on scala 2.10 and this jar conflict is causing problems.
Pubsub trait has flag variables 'pubSub'.
This variable is still true after Consumer thread finished.
I think it should be false at least when unsubscribed all.
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
Both ZRANGEBYSCORE and ZREVRANGEBYSCORE support a argument called WITHSCORES.
http://redis.io/commands/zrangebyscore
and
http://redis.io/commands/zrevrangebyscore
Scala redis doesn't seem to have that option
Redis client throws an exception with the message "ERR operation not permitted" (after I successfully have authenticated). This happens only after a while. Is it possible that the connection is reset or something if it is not being used for some time?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.