2016-07-06 55 views
1

黑客拥有<<__Memoize>>属性可轻松缓存方法结果。在Hack语言中记忆属性 - 缓存超时

如何使用它缓存某些数据库或API请求的结果有限的时间量

比方说,我的代码非常频繁,需要从数据库的一些信息:

public function loadEmployees(
    string $company_name, 
): ImmSet<string> { 
    return $this->db->sqlQuery(...); 
} 

为了提高性能,我想缓存结果一分钟。

如果数据发生变化,我的程序会在一分钟内看到它。结果陈旧了一分钟,我很好。

检查了official docs

回答

2

在请求的上下文中仅记住生命。您的请求需要一分多钟?如果是这种情况,Memoize不适合您的用例。

+1

然后Memoize是完美的,谢谢!我认为它在虚拟机的整个生命周期中都是缓存的。这可能会使用大量内存,但文档说如果需要,缓存可以自动清除。 –

+0

文档现在说“__Memoize属性允许函数或方法在给定请求的持续时间内缓存它们的结果。” –

3

< < __Memoize >>只在请求的整个生命周期内缓存,并且不跨请求共享。这很可能不会发生持续时间超过一分钟的HTTP请求,所以听起来您想要一个跨多个请求共享的缓存。 APC通常用于此(参见http://php.net/apc)。如果您真的想在请求中更细化地控制缓存,则需要使用静态成员或全局变量来推送自己。

+0

然后Memoize是完美的,谢谢!我认为它在虚拟机的整个生命周期中都是缓存的。这可能会使用大量内存,但文档说如果需要,缓存可以自动清除。 –

+0

虽然这个答案比较完整,但我会接受@ Gareve的答案。谢谢! –

+1

还要记住,'__Memoize'没有驱逐策略 - 它在请求结束时被清除,但不能控制它在请求中保留多久;在一个请求中,HHVM可以自由地将其永久缓存或者其他一些不确定的时间。根本没有手动控制。这个想法是,它缓存昂贵但幂等的计算;一个HTTP请求将在技术上起作用,但并不真正属于这种范式,所以如果你需要更复杂的语义,你最好用别的东西。 –