我在我的应用程序中设置了一个简单的关注者/关注系统。
在会话期间存储完整的'用户跟随'的最佳方法是什么,这样我就不必多次查询数据库。
澄清:当用户在获得授权后登录时,我会查询数据库,获取登录用户所关注的用户的完整列表,并最终将其存储为JavaScript变量。这样整个网站,当用户浏览时,我可以不断检查以下状态,以防止他们遇到的任何其他用户。
此查询仅在用户加载整页时执行一次,而不会重复导航。
这适用于javascript生成的内容,即用户hovercards等...
但是我想在PHP本身中存储这个数组(只有用户ID),以便在生成需要执行“跟随者/跟随”检查的内容服务器端时,我可以阻止对下表的进一步查询。 p>
最好的方法是什么?
请记住结果是在memcached中缓存的,但如果我可以完全避免任何查找并且有一个一致的数组来检查那将是很好的。
提前致谢
答案 0 :(得分:2)
那么让我说得对,你想存储这个列表,以便每页都不查询它?
首先我建议你只在需要这些数据的页面上执行此查询,然后我会说在这些页面上你不会尝试这个。
想象一下,用户停止关注或开始关注。一些复杂的缓存计算器或事件冒泡程序被编程到您自己的PHP应用程序中以清除外部数据会话(这是不好的,用户可以访问不属于他们自己的数据,会话实际上是非常重要的)可能与安全性和性能有关。 / p>
更好的做法是为每个新页面再次执行查询。这将更容易,可能性能更高,并且不会进行微观优化。
如果你在一个页面上挑出10k行,那么你可能会做错事。你可能从错误的角度看待它。
答案 1 :(得分:1)
将其存储在会话变量中。
<强>更新强>
将当前用户存储在会话中,并将其添加到您正在执行的查询中以获取弹出信息,并添加它以测试弹出窗口人是否跟随当前用户。
答案 2 :(得分: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