Memcache缓存结果

时间:2012-07-18 18:13:39

标签: php performance memcached

请考虑以下代码:

function getUser($uid) {
    global $_memcache;
    $u = $_memcache->get("user-".$uid);
    if( !$u) {
        $u = ... // get user from database
        $_memcache->set("user-".$uid,$u);
    }
    return $u;
}

现在,这个功能可能会被称为很多。例如,在论坛上,可以在单个页面加载中调用30次以上。值得做以下事情,还是Memcache已经足够好了?

function getUser2($uid) {
    static $localcache = [];
    if( isset($localcache[$uid])) return $localcache[$uid];
    return $localcache[$uid] = getUser($uid);
}

2 个答案:

答案 0 :(得分:0)

最终memcached是在内存存储中,就像在PHP数组中存储值一样。如果memcached实例与运行代码的服务器位于同一服务器上,那么我肯定会说使用memcached而不是memcached和PHP数组,因为你最终只需要在机器上使用〜两倍的内存。将相同的数据存储在内存中两次。

如果memcached是在单独的基础设施上(很可能),那么我想我会考虑为用户存储的数据大小。如果它很大并且您可能在PHP阵列中存储大量用户,则意味着您可能会在Web服务器上吸收的内存超出您的预期,在这种情况下,重复访问memcached中的数据,同时略微总体访问时间较慢,可能会在服务器负载下提供显着的应用程序性能。

就个人而言,我可能倾向于依赖每个请求的memcached,因为它只是更具可扩展性。

答案 1 :(得分:0)

Kolink,我想对迈克提出另一种看法。首先,如果getUser请求的数量大约为~50 /页或甚至几百,那么存储问题就不重要了。

其次,memcached用完了,所以即使memcached在同一个系统上,每次 get()调用仍会遇到两个用户模式上下文切换,所以这里的关键问题是一个简单的统计数据:每页用户出现的预期数量是多少?如果这是2,那么你的本地PHP缓存将是与memcached相关的上下文切换数量的一半。

然而,通过使用memcached multi-get 功能可以实现真正的节省 - 如果你调用 memcache :: get(),那么PHP内存扩展会使用它strong>包含一系列值。但是,这需要双通算法和代码的一些更改。安全地执行此操作的一种方法是根据您的第二个示例使用本地缓存的getUser(),但添加页面结构的第0次扫描以检测推定的memcache获取目标,执行唯一排序,然后使用基于此列表的多次获取。

主线仍然可以使用缓存的get和fault返回到D / B以在memcache中设置user-XXX,但是这样一个高(例如95%)的用户查询将满足于单个out-进程调用memcached。

是的,增加了一些复杂性,但我认为性能分红使其值得尝试。