0

我在我的应用程序中设置了一个简单的关注者/关注系统。

在会话期间存储完整的“用户关注”数组的最佳方法是什么,这样我就不必在整个过程中多次查询数据库。

澄清一下:当用户在获得授权后登录时,我会查询数据库,获取登录用户关注的用户的完整列表,并最终将其存储为 JavaScript 变量。这样在整个站点中,当用户四处导航时,我可以不断地检查他们可能遇到的任何其他用户的以下状态。

此查询仅在用户加载整个页面时执行一次,而不会重复浏览它。

这适用于 javascript 生成的内容,即用户悬停卡等...

但是,我想将此数组(仅包含用户 ID)存储在 PHP 本身中,以便在生成需要执行“关注者/关注者”检查的内容服务器端时防止进一步查询下表。

最好的方法是什么?

请记住,结果缓存在 memcached 中,但如果我可以完全避免任何查找并有一个一致的数组来检查,那就太好了。

提前致谢

4

3 回答 3

2

所以让我来做对了,你想存储这个列表,这样就不会在每个页面上查询它?

首先,我建议您仅在需要此数据的页面上执行此查询,其次我会说在这些页面上您不要尝试此操作。

想象一个用户停止关注或开始关注。一些复杂的缓存计算器或事件起泡器编程到您自己的 PHP 应用程序中以清除外部会话数据(这很糟糕,用户可以访问不属于他们自己的数据,会话事实)可能会与安全性和性能相关。

更好的做法是对每个新页面再次执行查询。这会更容易,可能更高效,并且不会进行微优化。

编辑

如果您在一页上选择 10k 行,那么您可能做错了什么。你可能从错误的角度看待它。

于 2012-09-21T14:14:03.327 回答
1

想到的两种方法是每次只编写带有良好放置索引的连接,您说过您不想这样做,并且只是会话中的一个简单数组,可能看起来像这样:

if (!isset($_SESSION['following']) {
    $following = $user->getFollowingIds(); //some query in here to get an array of ids
    $_SESSION['following'] = $following;
    $_SESSION['following_str'] = implode(',', $following);
}

然后,每当您想为关注的人提取所有状态时,$user您都可以编写一个查询,如下所示:

$query('SELECT status.* FROM status WHERE user_id IN (' . $_SESSION['following_str'] . ')'); //not sanitized or safe but you get the idea
于 2012-09-21T14:27:58.047 回答
1

将其存储在会话变量中。

更新

将当前用户存储在会话中并将其添加到您已经在执行的查询中以获取弹出信息并添加它测试弹出用户是否跟随当前用户。

于 2012-09-21T14:12:27.830 回答