gpt4 book ai didi

scala - Play 框架中 Futures 上的 Cache.getOrElse

转载 作者:行者123 更新时间:2023-12-04 18:04:15 24 4
gpt4 key购买 nike

在 playframework 中缓存 future 结果的正确方法是什么。例如。:

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”,因为它不会经常改变。但是我们在本地经常需要一些 userGravatar 信息。

这里我们缓存了 future 本身,但实际上我们只想缓存 future 的结果。有没有一种方便/正确的方法来做到这一点?

最佳答案

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

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)
}

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

关于scala - Play 框架中 Futures 上的 Cache.getOrElse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34612363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com