2014-12-13 31 views
1

我有一個類似Facebook的通知系統,用戶可以根據誰在特定站點發布/喜歡/評分獲得通知。將數據信息存儲在SESSION中而不是使用MySQL查詢?

在當你的一些內容的創作者或你已經張貼在具體內容與本下面的MySQL語句,你就會收到通知的那一刻:

SELECT 
n.`id`,n.`site`,n.`site_id`,n.`creator_uid`,n.`type`, 
nu.`id` AS nuid, nu.`uid` AS nu_uid, nu.`date`, 
nr.`id` AS nrid, nr.`uid` AS nr_uid, nr.`is_read`, 
u.`gender` 

FROM `notification` AS n 
LEFT JOIN `notification_user` AS nu ON nu.`nid` = n.`id` 
LEFT JOIN `notification_read` AS nr ON nr.`nid` = n.`id` 
LEFT JOIN `users` AS u ON u.`id` = nu.`uid` 
WHERE 
    nu.`uid` != '".$_SESSION['uid']."' AND nr.`uid` = '".$_SESSION['uid']."' 
    OR 
    (
    nu.`uid` = '".$_SESSION['uid']."' AND n.`type` = 'credits' 
    ) 
ORDER BY date DESC, nu.`id` DESC 
LIMIT 7 

現在我必須建立一個系統的朋友我也想把我的朋友們的活動也作爲通知展示出來。我想到在聲明中加入這個聲明,但是這個聲明被加載到整個網站的每個頁面上,我認爲這對性能來說已經相當困難。因此,通過users_friends表每次也「收集」我的朋友用戶ID會更難以表現,我想。因此,我認爲,一旦存儲在我的SESSION這個朋友的用戶ID數據是這樣的:

// get friends user ids 
$result = mysql_query("SELECT 
CASE 
WHEN `sent_uid`='".$_SESSION['uid']."' THEN `get_uid` 
WHEN `get_uid`='".$_SESSION['uid']."' THEN `sent_uid` 
END AS uid 

FROM `users_friends` WHERE `status`='1' AND 
(`get_uid`='".$_SESSION['uid']."' OR `sent_uid`='".$_SESSION['uid']."') 
") or die(mysql_error()); 
$i=1; 
    $num_rows = mysql_num_rows($result); 
if (!empty($num_rows) && empty($_SESSION['friends'])) 
{ 
    while ($data = mysql_fetch_assoc($result)) 
    { 
    $_SESSION['friends'][] = $data['uid']; 
    } 
} 

現在我有一個名爲$_SESSION['friends']包含「39,2,49」例如值的數組。我還沒有想過現在在通知查詢中實現這個功能,因爲我想首先詢問這種嘗試是否合理,或者我應該採取另一種方式來做到這一點?我很欣賞任何建議。

回答

1

你可以實現類似的東西,但恕我直言,你需要一個緩存方法。

它取決於幾個因素,但作爲一般規則,我不會使用會話來存儲應該保持的數據。在這種情況下,我會做這樣的事情:

  1. 安裝APC(或其他高速緩存系統)
  2. 如果使用Laravel或其他一些PHP FW處理緩存將超級容易,反正......做一個功能得到你的查詢,並且在這個函數內檢查一個基於用戶ID的緩存鍵。如果緩存鍵值存在,則返回其值,否則查詢您的數據庫並將結果保存在緩存中。
  3. 每次更新此用戶好友列表的數據時,請清除用戶相關的高速緩存鍵。

這樣你就可以保留數據並避免DB錘擊和會話變通方法。

只是一個想法,希望它有幫助或啓發。好看!

+0

「你應該持久保留」是什麼意思? (英語不是我的母語)。謝謝,我會研究這一點。我從來沒有使用過PHP框架,並在Bootstrap和JQuery的幫助下自己編寫代碼。因此,這基本上和一般來說都比在康斯坦丁的回答中所說的會話中存儲數千個數據更合適? – AlexioVay 2014-12-14 06:06:12

+0

嘿@Vay沒問題英語也不是我的母語。堅持數據意味着將數據存儲在數據庫,文件系統中,而不是臨時存儲。基本上,Session只是服務器Ram內存中的一些東西。想象一下你的網站有一個搜索表單,你想記住你的用戶的最後一次搜索,也許這是完美的存儲會話。因爲你不需要將它存儲在數據庫中。在您的示例中,您需要將此信息存儲在數據庫(持久數據)中,以便將此數據從此會話中提取出來(例如,另一個用戶獲取此用戶的好友列表) – jhmilan 2014-12-14 10:02:23

1

爲什麼更多的時候可以少做點更好的解決方案?:) 爲什麼要用逗號分隔字符串?只需將它存儲爲一個數組。這樣你可以做各種各樣的東西,比如search array, etc,並且只要你需要逗號分隔的字符串,你可以使用implode()function

另外,如果如果填充$ _SESSION ['friends'],則不需要查詢數據庫,將查詢帶入條件塊。

if (empty($_SESSION['friends'])) { 
    $result = mysql_query(...); 
    while ($data = mysql_fetch_assoc($result)) { 
     $_SESSION['friends'][] = $data['uid']; 
    } 
} 
+0

謝謝你,你是對的,我剛剛編輯過那部分。我會使用'$ friends = implode(「,」,$ _ SESSION ['friends']);'然後查詢。所以你也認爲它是一個很好的性能解決方案,首先使用session來存儲用戶id,而不是每次都使用額外的連接來獲取它們。 – AlexioVay 2014-12-13 08:48:47

+1

額外加入?緩存幾乎總是比沒有更快。在我的應用程序中,我在$ _SESSION中存儲了超過1000種不同的東西,這樣我就不必每次查詢數據庫時都要查詢數據庫 – Konstantin 2014-12-13 08:52:28

相關問題