在实时策略中显示分离度

时间:2012-06-06 03:00:20

标签: mysql php-5.3 social

我有一个网站,允许用户通过跟随彼此“相互连接”。该网站需要显示统计数据,例如“你有X个共同关注者”或“你跟随X共同人”。到目前为止,这个计算已经实时处理,但现在我们有太多用户及时实时计算。

我正在考虑缓存或以其他方式提高此计算性能的选项,但在此之前我意识到可能已经存在一个常见的方法来解决这个问题,可以在我过度工程化之前以更简单的方式解决它我自己。

使用的技术:PHP 5.3,MySQL 5.5,nginx和Linux环境。

2 个答案:

答案 0 :(得分:1)

我假设您不会从很多地方更改朋友列表,也不会经常更改。因此,您可以在必要时轻松地使缓存失效。创建一个包含4行的表:id1, id2, num, date,并在id1,id2和date上设置索引。现在使用答案中的方法缓存您的数据,但如果您希望这样做,则需要自己删除旧条目。只需添加以下内容:

if rand(1, 100) == 1:
    SQL(DELETE FROM cache WHERE date < now - ***)

同时确保id1&lt; id2,以避免缓存中的重复。

当用户的好友列表发生更改时,删除所有与该用户关联的高速缓存条目。这样,您的号码将始终是最新的。

如果您不在乎这些数字是否有点,那么您的解决方案就可以了 - 只需规范化$ key,以便id1&lt; ID2。

答案 1 :(得分:0)

我解决这个问题的第一个方法就是使用存储在内存中的缓存层(可能使用内存缓存)

当用户查看包含这些统计信息的页面时,请检查缓存以查看统计信息是否已存在。如果没有,请计算相互连接的数量,并将用户ID存储为缓存密钥的哈希值。

PHP中的示例,有些伪代码:

// Fred = User ID #47, George = User ID #94

$key = md5('47,94');

// Check that cache key is valid

if ($cache->isValid($key)) {
    return $cache->get($key);
} else {
    // ..calculate mutual connections
    $cacheTime = time() + (60 * 60 * 6);
    $value = calculateMutualConnections(array(47,94));
    $cache->save($key,$value,$cacheTime);
    return $value;
}

这会将缓存的值存储6个小时。不确定这是否足够时间。我相信这种方法可行,但可能不像我想的那样实时。