用戶將擁有一個用戶配置文件,他希望每個用戶都知道誰查看了他們的配置文件。我能想到的唯一方法就是在每次有人查看配置文件頁面(可能在頁面末尾使用Ajax調用)時執行數據庫INSERT操作。這聽起來像是一個巨大的性能問題,特別是如果網站建立起任何重要的流量。在Rails網站上跟蹤用戶操作
有關如何以高性能方式實現此目標的任何想法,還是僅僅是追蹤這類事物的本質?
謝謝。
用戶將擁有一個用戶配置文件,他希望每個用戶都知道誰查看了他們的配置文件。我能想到的唯一方法就是在每次有人查看配置文件頁面(可能在頁面末尾使用Ajax調用)時執行數據庫INSERT操作。這聽起來像是一個巨大的性能問題,特別是如果網站建立起任何重要的流量。在Rails網站上跟蹤用戶操作
有關如何以高性能方式實現此目標的任何想法,還是僅僅是追蹤這類事物的本質?
謝謝。
如果您使用的是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
這將或者插入一行,或更新計數的現有行。
爲什麼要添加另一個ajax調用來查看?
做時,你撥打的用戶個人資料顯示的動作。在控制器
其隊列到後臺作業(例如:starling + workling)
不使用酸DB的觀察數據,使用某種(cassandra,redis等)
該解決方案將限制被修改的表的大小,但它不是一個非常有效的審計方法。你必須做一個選擇然後插入或更新,所以你的表需要更好的外鍵索引。此外,您會丟失訪問時間戳等信息。 – 2011-03-05 02:11:48