我有一个网站,允许用户通过跟随彼此“相互连接”。该网站需要显示统计数据,例如“你有X个共同关注者”或“你跟随X共同人”。到目前为止,这个计算已经实时处理,但现在我们有太多用户及时实时计算。
我正在考虑缓存或以其他方式提高此计算性能的选项,但在此之前我意识到可能已经存在一个常见的方法来解决这个问题,可以在我过度工程化之前以更简单的方式解决它我自己。
使用的技术:PHP 5.3,MySQL 5.5,nginx和Linux环境。
答案 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个小时。不确定这是否足够时间。我相信这种方法可行,但可能不像我想的那样实时。