【问题标题】:Tracking User Actions on Rails website在 Rails 网站上跟踪用户操作
【发布时间】:2010-01-07 16:24:17
【问题描述】:

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

关于如何以高效的方式实现这一点的任何想法,或者仅仅是跟踪这类事情的本质?

谢谢。

【问题讨论】:

    标签: ruby-on-rails performance tracking


    【解决方案1】:
    1. 为什么要添加另一个 ajax 调用来查看?
      当您在控制器中调用用户配置文件显示操作时执行此操作

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

    3. 不要对查看的数据使用酸数据库,使用某种键值存储数据库(cassandra、redis 等)

    【讨论】:

      【解决方案2】:

      如果您使用的是 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
      

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

      【讨论】:

      • 此解决方案将限制正在修改的表的大小,但它不是一种非常有效的审计方法。您必须先进行选择,然后再进行插入或更新,因此您的表需要对外键进行更好的索引。此外,您还会丢失访问时间戳等信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      相关资源
      最近更新 更多