每个用户都有一个用户配置文件,他希望每个用户都知道谁查看了他们的配置文件。我能想到的唯一方法是在每次有人查看个人资料页面时执行数据库 INSERT(可能在页面末尾使用 Ajax 调用)。这听起来像是一个巨大的性能问题,特别是如果该网站建立了任何重要的流量。
关于如何以高性能方式实现这一目标的任何想法,或者仅仅是跟踪这种事情的本质?
谢谢。
每个用户都有一个用户配置文件,他希望每个用户都知道谁查看了他们的配置文件。我能想到的唯一方法是在每次有人查看个人资料页面时执行数据库 INSERT(可能在页面末尾使用 Ajax 调用)。这听起来像是一个巨大的性能问题,特别是如果该网站建立了任何重要的流量。
关于如何以高性能方式实现这一目标的任何想法,或者仅仅是跟踪这种事情的本质?
谢谢。
为什么要添加另一个 ajax 调用来查看?
当您在控制器中调用用户配置文件显示操作时执行此操作
将其排队到后台作业(例如:starling + workling)
不要对查看的数据使用酸数据库,使用某种键值存储数据库(cassandra、redis 等)
如果您使用的是 MySQL,我非常喜欢使用“INSERT INTO...ON DUPLICATE KEY”功能,该功能允许您在存在密钥冲突时对行执行更新。这意味着每个用户 + 配置文件对可能有一行,或者更精细,用户 + 配置文件 + 天,而不是每个配置文件视图一行。
根据您的交通状况和数据库引擎的选择,即使在很长一段时间内,这也可能会很好地工作。虽然像这样的跟踪表中可能有非常多的行,但内容非常少,就像一对 ID 字段和一个数字计数器,每个条目大约 12-16 个字节。
例如,跟踪表可能定义为:
def self.up
create_table :user_profile_views do |t|
t.integer :user_id
t.integer :profile_user_id
t.integer :count, :default => 0
end
add_index :user_profile_views, [ :user_id, :profile_user_id ], :unique => true
end
对于模型:
def self.record_view_profile!(user, profile)
connection.execute(sanitize_sql([ "
INSERT INTO user_profile_views (user_id, user_profile_id, count)
VALUES (%d,%d,1)
ON DUPLICATE KEY UPDATE
count=count+1
", user.id, profile.id ])
end
这将插入一行,或更新现有行的计数。