我有一个用户浏览搜索结果的网站。记住用户查看过的结果并将其标记为Viewed
。
问题:要实施这样的Recently Viewed
列表功能,这是推荐的方法吗?
使用像MySQL这样的RDBMS。每次用户单击链接时,都会向服务器发出AJAX调用,以将新行插入到表views
中,其中包含id
,user_id
,item_id
,{{{ 1}}。在显示任何搜索结果之前,每个项目都会针对表格timestamp
进行id
检查,以确定该列表是否会标记为views
。
(如果这有帮助,我的PHP框架Laravel可以使用数据库或redis作为会话驱动程序而不是使用cookie)
使用像Redis这样的内存数据存储。我没有使用redis / memcached的经验,考虑使用它的原因是因为对viewed
表的大量写入,并且读取主要由主键选择(是否存在索引的概念)在Redis?)
感谢您提出任何建议和意见,特别是那些对这两项技术有经验的人。
答案 0 :(得分:0)
我有类似的东西,但它应该适用于你想要达到的目标。你不能只通过在每个页面中包含一个文件来存储他们访问的页面。如果您有一个session.php文件或每个页面上包含的类似内容,您可以将以下代码添加到该文件中
$insert = mysql_query("INSERT INTO views VALUES
('$user_id','$itemid','$timestamp')");
(id应在数据库中自动递增)
这将插入页面,并且它是当前所在的ID。您需要在该页面中定义页面ID。对我来说这很简单,因为我使用profile.php?id=1
之类的东西。然后在显示搜索结果的位置..
$checkid = mysql_query("SELECT * FROM views WHERE user_id='$userid' & itemid='$itemid');
$views = mysql_num_rows($checkid);
if($views > 1){
$viewed = "false";
}else{
$viewed = "true";
}
然后在您的页面上显示您可能拥有的结果 if($ seen =“true”){ echo“你查看过此页面$ views time(s)”; } elseif($ seen =“false”){ echo“你还没看过这个页面”; }
如果你遇到一些没有意义的事情告诉我,我正在睡不着多少小时!哈哈(我不是一个PHP高手)
答案 1 :(得分:0)
在您提及的技术之间进行选择时没有经验法则,至少没有更全面的上下文(例如服务器负载,访问量,数据量,数据库写入与读取比率等),因为它们都没有比另一个“更好”,它们只是不同的工具。
每页一个MySQL INSERT
视图除了依靠成千上万的并发(即同时访问网站)之外,不太可能造成性能上的轻微打击在完全相同的时间)用户。我建议:专注于MySQL,因为这似乎是你最了解的,因为你会更快地移动并获得你之前完成的任何工作。如果它真的最终成为瓶颈,你将永远能够在以后切换到另一种方法。
话虽如此:如果你觉得冒险,时间不是问题:
redis非常适合您的目标。 实际上,每个用户都有一个排序集 itemID,时间戳作为分数。这很容易检索(名称 用户ID之后的每个密钥,例如user:$ userid:recentviews),很简单 paginate(ZREVRANGE可以获得最新的x视图)并且很简单 到期(ZREMRANGEBYRANK的范围介于0和时间戳之间 现在 - 30天删除超过30天的所有条目,例如) 并且与MySQL相比应该具有相对内存效率 对应部分。如果这一切听起来像是乱码,请不要担心,一旦你学习了redis,它实际上非常直观。
Memcached被严格地设计为缓存而不是数据存储,因此它的数据类型有点不灵活(你很可能必须存储json字符串并解析/字符串 - 如果它们当你去的时候,如果不能完全检索列表而不能完全检索列表会带来额外的不便,而且与redis不同,它不会将数据保存到磁盘,所以我个人不会推荐它用于你最近的视图系统。如果您最近的观看数据不稳定且很小,它可能适合,但我认为memcached并不比redis快得多。
如果你有时间,我会建议你搜索和阅读更多关于redis和memcached的内容,直到你能够很好地了解它们是什么以及如何使用它们。只有这样你才能做出明智的决定。但正如我之前提到的,请记住,除非您的需求非常特殊,否则MySQL可以很好地完成工作而不会出现性能问题。