gpt4 book ai didi

java - 避免缓存失败的操作

转载 作者:行者123 更新时间:2023-11-30 11:42:55 25 4
gpt4 key购买 nike

编辑
开始处理(抛出异常),然后就没有“坏”数据可以缓存了。通过捕获异常,甚至包含在 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/

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