java - 避免缓存失败的操作

标签 java scala caching playframework-2.0

编辑
开始处理(抛出异常),然后就没有“坏”数据可以缓存了。通过捕获异常,甚至包含在 Either[Why-Fail, Option[T]] 中,我只是为自己做了更多的工作。异常是(理想情况下)异常的,所以记录、抛出并继续……

原创
缓存是好的,但缓存失败的操作是不好的

Cache.orElse("directory.active") {
  Ok( dao.findAll(active = true) as json )
}

DAO 数据库查找可能会失败(在这种情况下,数据库/查询失败会返回一个空列表),这会导致缓存错误数据。

如何解决这个问题?我们只想运行一次查询,然后缓存以供进一步请求。在 Scala 中,您可以进行惰性初始化,但这会产生永久缓存,这也是不可取的(需要在成员目录添加/编辑时清除缓存)。

假设这适用于任何平台:基本上需要执行一次操作并将其缓存成功结果

最佳答案

我手边没有 Cache 实现,所以无法测试这个,但是像这样的东西怎么样:

def getCache[A](key:String, result:()=>A)(invalidTest:A=>Boolean):Option[A] = {
  Cache.get(key).getOrElse {
    result match {
      case m:A if (!invalidTest(m)) => Cache.set(key,m);Some(m)
      case _ => None
    }
  }
}

getCache("directory.active", () => dao.findAll(active = true))(_.isEmpty)

正如您所说,您可以轻松地拉动缓存来添加它,并对您放入缓存的类型进行默认有效性测试。

如果您想改为缓存 Action 结果(如果您总是返回 json,并且如果 as json 返回类型 Json —— 抱歉,不是 Play 人),也许:

def getCache[A](key:String, result:()=>A)(invalidTest:A=>Boolean):SimpleResult[Json] = {
  Cache.get(key).getOrElse {
    result match {
      case m:A if (!invalidTest(m)) => Cache.set(key,Ok(m as json));Ok(m as json)
      case x:A => Ok(x as json)
      case _ => Ok(errorjson as json)
    }
  }
}

getCache("directory.active", () => dao.findAll(active = true))(_.isEmpty)

关于java - 避免缓存失败的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11472864/

相关文章:

java - 使用@play.cache.NamedCache(value=session-cache) 注释的 play.cache.CacheApi 的实现没有绑定(bind)到 Production

scala - 堆栈安全展开

基于 Scala 磁盘的 Map

java - 为什么下面的Java代码会出现StackOverflowError?

java - java 中的加密 - 最佳实践?

scala - 如何在Scala中使用同步?

scala - 如何在 sbt 下使用 Quasar 和 Scala?

asp.net - WCF 缓存与 Page.Cache

java - 将 UncaughtExceptionHandler 附加到 TimerTask

java - Jersey 可见导致 404