在Rails网站上跟踪用户操作

时间:2010-01-07 16:24:17

标签: ruby-on-rails performance tracking

每个用户都有一个用户个人资料,他希望每个用户都知道谁查看了他们的个人资料。我能想到这样做的唯一方法是每当有人查看个人资料页面时(可能在页面末尾使用Ajax调用)执行数据库INSERT。这听起来像是一个巨大的性能问题,特别是如果网站建立了任何重要的流量。

关于如何以高效的方式实现这一目标的任何想法,还是仅仅跟踪这种事情的本质?

感谢。

2 个答案:

答案 0 :(得分:4)

  1. 为什么要添加另一个ajax调用来查看?
    在控制器中调用用户配置文件show action ..时执行此操作

  2. 将其排队到后台工作(例如:starling + workling

  3. 不要使用酸性DB来查看数据,使用某种键值存储db(cassandra,redis等)

答案 1 :(得分:3)

如果您正在使用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

这将插入一行,或更新现有行的计数。