Scaffeine
A thin Scala wrapper for Caffeine (https://github.com/ben-manes/caffeine).
Browse the API docs for the latest release.
Motivations
Caffeine is an awesome Java caching library. It has an impressive performance and a neat Java 8 API.
However the API does not play very well with Scala. So this is the thinner wrapper we can came with to make Caffeine easy and idiomatic to use in Scala.
API
Cache
"Cache" should "be created from Scaffeine builder" in {
import com.github.blemale.scaffeine.{ Cache, Scaffeine }
import scala.concurrent.duration._
val cache: Cache[Int, String] =
Scaffeine()
.recordStats()
.expireAfterWrite(1.hour)
.maximumSize(500)
.build[Int, String]()
cache.put(1, "foo")
cache.getIfPresent(1) should be(Some("foo"))
cache.getIfPresent(2) should be(None)
}
LoadingCache
"LoadingCache" should "be created from Scaffeine builder" in {
import com.github.blemale.scaffeine.{ LoadingCache, Scaffeine }
import scala.concurrent.duration._
val cache: LoadingCache[Int, String] =
Scaffeine()
.recordStats()
.expireAfterWrite(1.hour)
.maximumSize(500)
.build((i: Int) => s"foo$i")
cache.get(1) should be("foo1")
}
AsyncLoadingCache
"AsyncLoadingCache" should "be created from Scaffeine builder with synchronous loader" in {
import com.github.blemale.scaffeine.{ AsyncLoadingCache, Scaffeine }
import scala.concurrent.duration._
val cache: AsyncLoadingCache[Int, String] =
Scaffeine()
.recordStats()
.expireAfterWrite(1.hour)
.maximumSize(500)
.buildAsync((i: Int) => s"foo$i")
whenReady(cache.get(1)) { value =>
value should be("foo1")
}
}
"AsyncLoadingCache" should "be created from Scaffeine builder with asynchronous loader" in {
import com.github.blemale.scaffeine.{ AsyncLoadingCache, Scaffeine }
import scala.concurrent.duration._
val cache: AsyncLoadingCache[Int, String] =
Scaffeine()
.recordStats()
.expireAfterWrite(1.hour)
.maximumSize(500)
.buildAsyncFuture((i: Int) => Future.successful(s"foo$i"))
whenReady(cache.get(1)) { value =>
value should be("foo1")
}
}
Download
Download from Maven Central or depend via SBT:
"com.github.blemale" %% "scaffeine" % "<version>" % "compile"
Snapshots of the development version are available in Sonatype's snapshots repository.