5

我有一个用户浏览搜索结果的网站。记住用户查看了哪些结果并将它们标记为 将很有用Viewed

问题:要实现这样的Recently Viewed列表功能,推荐的方法是什么?

  1. 使用像 MySQL 这样的 RDBMS。每次用户单击链接时,都会向服务器发出 AJAX 调用,以将新行插入到包含、、、views列的表中。在显示任何搜索结果之前,将根据表格检查每个项目,以确定该列表是否将标记为。 (如果这有帮助,我的 PHP 框架 Laravel 可以使用数据库或 redis 作为会话驱动程序,而不是使用 cookie)iduser_iditem_idtimestampidviewsviewed

  2. 使用像 Redis 这样的内存数据存储。我对redis/memcached没有经验,想到用这个的原因是因为对viewed表的写入量很大,而读取主要是通过主键选择的(Redis中有索引的概念吗?)

感谢您的任何建议和意见,尤其是那些对这两种技术有经验的人。

4

2 回答 2

1

在您提到的技术之间进行选择时没有经验法则,至少在没有更全面的上下文(例如服务器负载、访问量、数据量、数据库写入与读取比率等)的情况下,因为没有它们比另一个“更好”,它们只是不同的工具。

除非您指望拥有数以万计的并发(即同时访问站点,同时访问该站点)用户,否则每个页面视图一个 MySQLINSERT不太可能对性能造成哪怕是最轻微的影响。我建议:专注于 MySQL,因为这似乎是你最了解的,因为你会更快地移动,并且更早地完成你正在做的任何事情。如果它真的最终成为瓶颈,您以后总是可以切换到不同的方法。

话虽这么说:如果您喜欢冒险并且时间不是问题:

  • redis 将非常适合您尝试做的事情。基本上,每个用户都有一个排序集,其中包含以时间戳作为分数的 itemid。这很容易检索(在用户 id 之后命名每个键,例如 user:$userid:recentviews),易于分页(ZREVRANGE 将为您提供最近的 x 视图)并且易于过期(ZREMRANGEBYRANK 范围在 0 到 a例如,现在 30 天的时间戳以删除所有早于 30 天的条目),并且与其 MySQL 对应部分相比应该具有相对的内存效率。如果现在这一切听起来像胡言乱语,请不要担心,一旦您学习了 redis,这一切实际上都非常直观。

  • Memcached 被严格设计为缓存而不是数据存储,因此它的数据类型有点不灵活(您很可能必须存储 json 字符串并随时解析/字符串化它们,这有增加的不便是无法部分编辑列表而不首先完全检索它)并且与redis相反,它不会将数据持久化到磁盘,因此我个人不建议将它用于您最近的视图系统。如果您最近的视图数据不稳定且很小,它可能适合,但我认为 memcached 无论如何都不会比 redis 快得多。

如果你有时间,我建议你搜索和阅读更多关于 redis 和 memcached 的内容,直到你对它们是什么以及如何使用它们有一个很好的了解;只有这样,您才能做出明智的决定。但正如我之前提到的,请记住,除非您的需求非常特殊,否则 MySQL 可能会很好地完成这项工作,而不会出现性能问题。

于 2012-10-17T11:44:49.107 回答
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($viewed = "true"){ echo "You have seen this page $views time(s)"; }elseif($viewed = "false"){ echo "你还没有浏览过这个页面"; }

如果你遇到一些没有意义的事情告诉我,我的睡眠时间不多了!哈哈(而且我并不是一个 PHP 高手)

于 2012-10-17T03:16:19.107 回答