2012-10-17 28 views
4

我有一個網站,用戶瀏覽搜索結果。記住用戶查看了哪些結果會很有用,並將它們標記爲Viewed創建最近查看的列表,MySQL或Redis

問題:要實現這樣的Recently Viewed列表功能,這是推薦的方法嗎?

  1. 使用像MySQL這樣的RDBMS。每次用戶點擊一個鏈接,向服務器發起一個AJAX調用,以將新行插入到表views中,其列id,user_id,item_id,timestamp。在顯示任何搜索結果之前,每個項目將對照表views檢查每個項目,以確定該列表是否將標記爲viewed(如果這會有所幫助,我的PHP框架Laravel可以使用數據庫或Redis的作爲會議的驅動程序,而不是使用cookie)

  2. 使用的內存中的數據存儲像Redis的。我沒有使用redis/memcached的經驗,考慮使用它的原因是因爲大量寫入viewed表,讀取主要由主鍵選擇(是否存在Redis中的索引概念?)

感謝您的任何建議和意見,尤其是那些對這兩種技術有經驗的人。

+0

您是否打算在當前瀏覽會話之外堅持這一點? –

+0

是的,它應該持續到2周後,「views」表可以被修剪。視圖歷史記錄只對註冊用戶可用。 – Nyxynyx

+0

目前還不清楚爲什麼這個標籤爲'postgresql' –

回答

0

當談到在你提到的技術之間進行選擇時,沒有經驗法則,至少不是沒有更全面的上下文(例如服務器負載,訪問量,數據量,數據庫寫入和讀取比率等),因爲它們中的任何一個都比另一個「更好」,它們只是不同的工具。除非你具有併發數萬數(即,同時訪問該網站,在完全相同的時間)的用戶每個頁面瀏覽

一個MySQL的INSERT的可能性很小,甚至造成了slightlest性能命中。我會建議:專注於MySQL,因爲這似乎是你最瞭解的,因爲你會更快地移動並獲得你之前完成的任何工作。如果它真的最終成爲瓶頸,您將可以在以後隨時切換到其他方法。

話雖這麼說:如果你喜歡冒險和時間都不是問題:

  • Redis的將是你正在嘗試做一個非常適合。 本質上你會有一個每個用戶包含 itemids與時間戳作爲分數的排序集。這很容易找回(名稱 每個鍵後的用戶名,例如用戶:$ userid:recentviews),易於 分頁(ZREVRANGE會讓你最近的x個視圖)和容易 到期(ZREMRANGEBYRANK由範圍之間0和時間戳 現在爲30天,以刪除所有超過30天的條目,例如) ,並且與其MySQL 計數器部分相比應該具有相對高的內存效率。不要擔心,如果這一切聽起來像是亂碼,一旦你學習了redis,它實際上非常直觀。

  • Memcached嚴格設計爲緩存而不是數據存儲,因此它的數據類型有點不靈活(你很可能必須存儲json字符串並解析/字符串 - 如果它們是你去了,這增加了不方便的地方,因爲它不能夠部分地編輯列表而沒有完全檢索它),與redis相比,它不會將數據保存到磁盤,所以我個人不會推薦它用於最近的視圖系統。如果你最近的視圖數據是不穩定和小的話,它可能會適用,但我認爲memcached不會比redis快得多。

如果你有時間,我會建議尋找和閱讀更多關於Redis的和分佈式緩存,直到你有他們是什麼好圖片,以及如何使用它們;只有這樣你才能做出明智的決定。但正如我前面提到的那樣,請記住,除非您的需求相當出色,否則MySQL可以在沒有任何性能問題的情況下完成這項工作。

0

我有類似的東西,但它應該適用於你想要的東西。難道你不能通過在每個頁面中包含一個文件來存儲他們訪問的頁面。如果您有包括每一頁上session.php文件的文件或類似的東西,你可以把下面的代碼到

$insert = mysql_query("INSERT INTO views VALUES 
('$user_id','$itemid','$timestamp')"); 

(ID應該在數據庫中自動遞增)

這將插入頁面這是他們目前正在使用的ID。您需要在該頁面中定義頁面ID。對我來說這很容易,因爲我使用的東西如profile.php?id=1。然後,你將搜索結果顯示..

$checkid = mysql_query("SELECT * FROM views WHERE user_id='$userid' & itemid='$itemid'); 
$views = mysql_num_rows($checkid); 

if($views > 1){ 
$viewed = "false"; 
}else{ 
$viewed = "true"; 
} 

然後在網頁上顯示您的結果,你可以像 的東西,如果($熱門圖片=「真」){ 回聲「你看這個頁面$瀏覽時間(s)「; } elseif($ viewed =「false」){ echo「您還沒有查看此頁面」; }

如果你遇到了一些沒有道理的事情告訴我,我就在沒有多少小時的睡眠中跑步!哈哈(我並不完全是一個PHP的專家)