创建最近查看的列表,MySQL 或 Redis

Nyx*_*nyx 5 php mysql memcached redis

我有一个网站,用户可以在其中浏览搜索结果。记住用户查看过哪些结果并将其标记为 会很有用Viewed

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

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

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

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

Mah*_*ahn 1

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

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

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

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

  • Memcached 严格设计为缓存而不是数据存储,因此它的数据类型有点不灵活(您很可能必须存储 json 字符串并在使用时解析/字符串化它们,这有增加的不便之处在于,如果不先完全检索列表,就无法部分编辑列表),并且与 Redis 不同,它不会将数据保存到磁盘,因此我个人不推荐将其用于您最近的视图系统。如果您最近的视图数据不稳定且较小,它可能适合,但我不认为 memcached 比 Redis 快得多。

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