scalacache-redisで自前のcase classを保存する際には、そのcase classがSerializableをミクスインしていないとダメっぽい。
Serializableを使わないで格納できるようにするには、以下のCodecトレイトを実装すればよい。
Codecトレイト
trait Codec[A] {
def encode(value: A): Array[Byte]
def decode(bytes: Array[Byte]): Codec.DecodingResult[A]
}
以下のような感じで実装する。
User用のCodecを実装した例
import scalacache.Cache
import scalacache.redis.RedisCache
import scalacache.serialization.Codec
import scalacache.serialization.Codec.{ DecodingResult, tryDecode }
case class User(name: String)
private implicit val codec = new Codec[User] {
def encode(code: User): Array[Byte] = code.value.getBytes("UTF-8")
def decode(data: Array[Byte]): DecodingResult[User] = tryDecode(User(new String(data, "UTF-8")))
}
private implicit val cache: Cache[User] = RedisCache("localhost", 6379)
scalacache.put("key")(user, ttl = Nothing)
JSONとして格納する
しかし上のやり方だと複数の値を持つタイプのcase classのCodecを実装するのが難しい。
この場合にはcirceを用いてJSONとしてまるごと格納するのがよいとのこと。
import io.circe._
import io.circe.generic.semiauto._
case class User(name: String, age: Int)
implicit val catEncoder: Encoder[User] = deriveEncoder[User]
implicit val catDecoder: Decoder[User] = deriveDecoder[User]