加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Playframework中Futures的Cache.getOrElse

发布时间:2020-12-16 09:56:56 所属栏目:安全 来源:网络整理
导读:在playframework中缓存未来结果的正确方法是什么.例如.: val userGravatar: Future[JsValue] = RemoteGravatarService.get(user.id,user.email)object RemoveGravatarService { def get(userId: String,email: String): Future[JsValue] = { Cache.getOrEls
在playframework中缓存未来结果的正确方法是什么.例如.:

val userGravatar: Future[JsValue] = RemoteGravatarService.get(user.id,user.email)

object RemoveGravatarService {
  def get(userId: String,email: String): Future[JsValue] = {
    Cache.getOrElse("gravatar-for-$userId",1.hour) {
      WS.url("gravatar.com/email=$email").get().asJson
    }
  }
}

我们不想每次都询问(这个虚构的)“Gravatar”,因为它并没有经常改变.但我们需要在本地使用som userGravatar信息.

在这里我们缓存未来本身,但实际上我们只想缓存未来的结果.有没有方便/正确的方法来玩这个?

解决方法

Play的API中没有一种方法可以处理期货.您可以包装Play的缓存API来处理返回Future的orElse情况.一般:

object FutureCache {

    def getOrElse[A](key: String,expiration: Int)(orElse: => Future[A])
      (implicit app: Application,ct: ClassTag[A],ec: ExecutionContext): Future[A] = {
        Cache.getAs[A](key).map(Future.successful).getOrElse {
            val value = orElse
            value onSuccess { case result => Cache.set(key,result,expiration) }
            value
        }
    }

}

用法:

FutureCache.getOrElse[JsValue]("gravatar-for-$userId",3600) {
  WS.url("gravatar.com/email=$email").get().map(_.json)
}

您还可以为使用Duration的getOrElse创建重载.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读