11

我只是想知道 Scala 中是否有任何可用的缓存解决方案。我正在寻找类似 Guava 在 Java 中提供的东西。

我应该在 Scala 中也使用 Guava 吗?Scalaz 中是否有包装器/皮条客或类似的东西?有没有更适合 Scala 开发人员的替代方案?

番石榴提供了什么:

LoadingCache<Key, Graph> CACHE= CacheBuilder.newBuilder()
       .maximumSize(1000)
       .expireAfterWrite(10, TimeUnit.MINUTES)
       .removalListener(MY_LISTENER)
       .build(
           new CacheLoader<Key, Graph>() {
             public Graph load(Key key) throws AnyException {
               return createExpensiveGraph(key);
             }
           });

Supplier<Animal> singleAnimalCache = Suppliers.memoizeWithExpiration(animalFromDbSupplier(), 365, TimeUnit.DAYS);

我需要一些基本的缓存管理,比如 Guava。

4

4 回答 4

5

我们有相同的要求,最终围绕 Guava 构建了包装器。我们最近开源了名为Mango的库的一部分。如果你不介意额外的依赖,你可以像这样使用它

import org.feijoas.mango.common.cache._
import org.feijoas.mango.common.base.Suppliers._

val MY_LISTENER = (remNot: RemovalNotification[Key, Graph]) => ()
// > MY_LISTENER : RemovalNotification[Key,Graph] => Unit = <function1>

val CACHE = CacheBuilder.newBuilder()
  .maximumSize(1000)
  .expireAfterWrite(10, TimeUnit.MINUTES)
  .removalListener(MY_LISTENER)
  .build { (key: Key) => new Graph() }
// > CACHE : LoadingCache[Key,Graph] = <function1>

val animalFromDbSupplier = () => {
  // load from db
  new Animal()
}
// > animalFromDbSupplier  : () => Animal = <function0>

val singleAnimalCache = memoizeWithExpiration(animalFromDbSupplier, 365, TimeUnit.DAYS)
// > singleAnimalCache  : () => Animal = Suppliers.memoizeWithExpiration(<function0>, 365, DAYS)
于 2013-08-04T11:19:46.313 回答
5

只是添加一个答案来插入我自己的项目,但我推荐 ScalaCache。

  • 支持 Guava、Ehcache、Memcached 和 Redis(或者您可以根据需要插入自己的实现)
  • 简单、惯用的 Scala API
  • 支持每个元素的生存时间(即使是 Guava,它不提供开箱即用的功能)
  • 支持使用宏魔法自动生成缓存键

https://github.com/cb372/scalacache

于 2014-10-20T04:38:14.677 回答
3

Scalaz 中是否有包装器/皮条客或类似的东西?

在 Scalaz 7 中Memo,我在学习 Scalaz day 16时介绍了一些内容。

这是 Adam Rosien 在scalaz “For the Rest of Us”演讲中提到的第一件事,所以也来看看吧。他正在使用 Scalaz 6。

于 2012-12-05T07:04:15.803 回答
3

在 Scala 中使用番石榴缓存很简单。

import com.google.common.base._
import com.google.common.cache._

object Simple_Guava_Caches_in_Scala {

   def main(args: Array[String]): Unit = {

      // Simple scala guava cache
      val simpleCache1 =
         CacheBuilder
           .newBuilder()
           .build(new CacheLoader[String, String] {
              def load(key: String): String = {
                 println(s"Simple scala guava cache, heavy work calculating $key")
                 s"It's me $key"
              }
           })
      println(simpleCache1.get("1"))
      println(simpleCache1.get("1"))
      println(simpleCache1.get("2"))
      println(simpleCache1.get("2"))
      println(simpleCache1.get("2"))


      // Simple scala guava supplier cache / factory
      println()
      val supplier_cache: Supplier[String] = Suppliers.memoize(
         () => {
            println("Simple scala guava supplier cache / factory, heavy work creating singleton:")
            "It's me"
         }
      )
      println(supplier_cache.get)
      println(supplier_cache.get)
      println(supplier_cache.get)
   }
}

这是生产

Simple scala guava cache, heavy work calculating 1
It's me 1
It's me 1
Simple scala guava cache, heavy work calculating 2
It's me 2
It's me 2
It's me 2

Simple scala guava supplier cache / factory, heavy work creating singleton:
It's me
It's me
It's me

我已将此添加到build.sbt

libraryDependencies += "com.github.cb372" %% "scalacache-guava" % "0.26.0"

将上面的编码转换为 cb372 的 scalacache-guava 会很有趣。可以更简单/更标准化。

于 2018-11-23T20:59:37.753 回答