Scala2.10.3 ãã Redis å¼ã£ã¦ã¿ã
scala-redis
https://github.com/debasishg/scala-redis
Maven ã®URLãç¡ãããããã¥ã¡ã³ãã¯ãã®ã¾ã¾ãã«ããã¦ãããªæãã ã£ãã®ã§ãclone ã㦠publpish-local ãã¦ä½¿ã£ãã
Apache2 ã©ã¤ã»ã³ã¹ãªã®ã§ãã½ã¼ã¹åãè¾¼ãã®ãæ£è§£ãããããªããjar é å¸ã£ã¦åºæ¥ããã¯ç¥ãããã©ã
import com.redis._ object Sample extends App { val client = new RedisClient("localhost", 6379) val isSet = client.set("SampleString", "SampleMessage") println(isSet) val result = client.get("SampleString") println(result) }
ã¾ããset ã®å é¨å®è£ ã
def set(key: Any, value: Any)(implicit format: Format): Boolean = send("SET", List(key, value))(asBoolean)
ãªã®ã§ããããã Format ãå®è£ ããã°è¤éãªåããããã¨æ¨æ¸¬ã§ãã
ããã®ããã©ã«ãå®è£ ã
object Format { def apply(f: PartialFunction[Any, Any]): Format = new Format(f) implicit val default: Format = new Format(Map.empty) def formatDouble(d: Double, inclusive: Boolean = true) = (if (inclusive) ("") else ("(")) + { if (d.isInfinity) { if (d > 0.0) "+inf" else "-inf" } else { d.toString } } } class Format(val format: PartialFunction[Any, Any]) { def apply(in: Any): Array[Byte] = (if (format.isDefinedAt(in)) (format(in)) else (in)) match { case b: Array[Byte] => b case d: Double => Format.formatDouble(d, true).getBytes("UTF-8") case x => x.toString.getBytes("UTF-8") } def orElse(that: Format): Format = Format(format orElse that.format) def orElse(that: PartialFunction[Any, Any]): Format = Format(format orElse that) }
ãªã®ã§ãFormat(f:Any => String)
ãªã·ãªã¢ã©ã¤ã¶ãæ¸ãã°å²ã¨ã©ãã¨ã§ããªãã¨ãã£ã¦ããã Generics 使ããªãããã¨æããªããªãã
ã§ã get ã¯
def get[A](key: Any)(implicit format: Format, parse: Parse[A]): Option[A] = send("GET", List(key))(asBulk)
ã§ãparse ãå ¥ã£ã¦ããããã ããParse ã®å®ç¾©ã¯ä¸è¨
object Parse { def apply[T](f: (Array[Byte]) => T) = new Parse[T](f) object Implicits { implicit val parseString = Parse[String](new String(_, "UTF-8")) implicit val parseByteArray = Parse[Array[Byte]](x => x) implicit val parseInt = Parse[Int](new String(_, "UTF-8").toInt) implicit val parseLong = Parse[Long](new String(_, "UTF-8").toLong) implicit val parseDouble = Parse[Double](new String(_, "UTF-8").toDouble) } implicit val parseDefault = Parse[String](new String(_, "UTF-8")) val parseStringSafe = Parse[String](xs => new String(xs.iterator.flatMap{ case x if x > 31 && x < 127 => Iterator.single(x.toChar) case 10 => "\\n".iterator case 13 => "\\r".iterator case x => "\\x%02x".format(x).iterator }.toArray)) } class Parse[A](val f: (Array[Byte]) => A) extends Function1[Array[Byte], A] { def apply(in: Array[Byte]): A = f(in) }
ãã¤ããªã§è¿ã£ã¦ãããã§ããã
ãããã«ãããã¤ãé åãããã·ãªã¢ã©ã¤ãºã§ããã°ããã
é åçã«çªã£è¾¼ãã®ã¯å¥IFããã
client.lpush(key, value1, value2, ...)(implicit Format) client.rpush(key, value1, value2, ...)(implicit Format) client.lpop(key)(implicit Format, Parser) client.rpop(key)(implicit Format, Parser)
ããçªã£è¾¼ã¾ãªãã
object Sample extends App { val client = new RedisClient("localhost", 6379) import serialization._ import Parse.Implicits._ client.hmset("hashMapSet", Map("field1" -> 32, "field2" -> 64)) println( client.hmget[String, Int]("hashMapSet", "field1", "field2") ) }
ãã ããMap[String, Any] ã¯ãã¾ãèµ°ã£ã¦ãããªãã£ããã¾ã仿¹ãªãããããã
éåæåå¾ããããã©ãåºæ¬ãã®ã¾ã¾åãã
scala-redis-nb
ä½ãã¾ã ã¢ã«ãã¡çãããã¨ããããã
https://github.com/debasishg/scala-redis-nb
name := "RedisSample" version := "1.0" scalaVersion := "2.10.3" resolvers += "spray" at "http://repo.spray.io/" libraryDependencies ++= Seq( "net.debasishg" %% "redisreact" % "0.3", "io.spray" %% "spray-json" % "1.2.5" )
ã¨ãã¦ãå ¬å¼ã»ã¼åçµã§
import akka.actor.ActorSystem import akka.util.Timeout import com.redis.RedisClient import scala.concurrent.duration._ case class User(id:Int, name:String, age:Int) case class Group(id:Int, name:String, users:List[User]) object Sample extends App { implicit val system = ActorSystem("redis-client") implicit val executionContext = system.dispatcher val client = RedisClient("127.0.0.1", 6379) import spray.json.DefaultJsonProtocol._ import com.redis.serialization.SprayJsonSupport._ implicit val childClass = jsonFormat3(User) implicit val groupClass = jsonFormat3(Group) val sampleValue = User(2, "delick", 28) client.set("key", sampleValue) import scala.concurrent.Await implicit val timeout = Timeout(5000) val result = Await.result(client.get[User]("key"), 5 seconds) println(result) system.shutdown() }
ã¨ãã¦ã¿ãæãNullpoè½ã¡ã
[error] (run-main) java.lang.NullPointerException java.lang.NullPointerException at akka.pattern.AskableActorRef$.ask$extension(AskSupport.scala:136) at com.redis.api.StringOperations$class.set(StringOperations.scala:23) at com.redis.RedisClient.set(RedisClient.scala:26) at Sample$delayedInit$body.apply(Sample.scala:24) /* ä¸ç¥ */ [trace] Stack trace suppressed: run last compile:run for the full output.
å¼ã³åºãã«é¢ãã¦ãæããã«ç´ ã® Akka ã«ãªããããªå¼ã³åºããã¦ãããimport ãæ¸ããã¦ãªãããå¼ã³åºãæ¹ãééã£ã¦ãã®ãããããªãã
ãããã«ãããæ å ±ç¡ãããã§ä½¿ããªã夿ã