2017-03-02 75 views
1

我有一個網站,客戶可以登錄併購買特定範圍內的產品(根據客戶編號)。導航欄有一個產品類別的下拉菜單,但沒有顯示任何沒有產品的地方。Cookie vs會話vs數據庫

當時,每個頁面上都會查詢數據庫以填充產品類別菜單,但這樣做效率不高。我現在想知道'允許'產品列表是否應該在會話開始時存儲在cookie或會話變量中。

從我從其他問題中收集到的信息來看,通常會使用會話變量,但他們警告不要在會話變量中存儲大量數據。在這種情況下,我會爲每個用戶存儲一個潛在的大型產品列表,因此cookies會更好嗎?我不會將產品列表列爲特別敏感,我會在下訂單之前進行服務器端檢查。還是應該堅持每次查詢數據庫的當前解決方案?

要清楚,我仍然會將信息存儲在數據庫中,這個問題只是詢問臨時存儲以便在整個會話中快速訪問。

我已經看過以下問題,但我仍然覺得自己對於特定場景的回答並不滿意,而且接近的問題沒有提及Cookie。

+0

緩存。始終緩存。如果你只是試圖避免往返數據庫,session和cookies從來都不是合適的選擇。 –

+0

請問有人能告訴我爲什麼投票嗎? –

+0

不確定,但一般來說,你的問題是堆棧溢出的主題。 –

回答

2

我會採取可能會是這樣的方法:

  • 將產品數據存儲在所有客戶共享的緩存中,並將每個產品的主鍵用作每個產品的緩存鍵(的一部分)。所使用的緩存策略可能因可伸縮性要求而異(System.Runtime.Caching vs redis vs file caching)。一般來說,我可能會使用滑動過期或LRU cache(請參閱this .NET example)獲取產品數據,因此最受歡迎的產品保留的緩存時間比不受歡迎的產品長。當某個特定主鍵發出請求時,會首先檢查該鍵的緩存,如果該鍵返回null,則在返回產品之前從數據庫和緩存中查找產品(請參閱this example)。
  • 對於每個客戶,僅存儲主鍵和其他相關數據(他們可能得到什麼類別的折扣等)。如果主鍵列表足夠小,那麼可以通過cookie(encrypted)來獲得。如果您需要按比例調整以使每個客戶都能夠放入Cookie中,則可以在數據庫中查詢主鍵。
  • 當客戶請求數據時,首先獲取主鍵列表,然後使用這些鍵訪問預緩存的產品數據以構建視圖。您可以根據需要存儲許多不同的主鍵列表,而無需從每個客戶的數據庫獲取產品數據,也無需爲每個客戶獲取每個用例。

Think twice about using session state - 建議不要使用用戶配置文件數據的會話狀態。

當然,以上沒有考慮到可能需要的任何其他營銷要求。所以你可能需要根據你的需求調整這個策略。例如,如果您需要更快地更新產品信息而不是緩存通常過期,那麼您可能會考慮一種方法,即首先更新數據庫中的產品數據,如果成功,則會獲取對緩存的寫入鎖定並更新緩存,太。這將允許近乎實時的緩存更新,而不必從數據庫中無效並重新加載緩存。

+0

我同意這裏的一切,除了會議狀態,甚至是一種可能性。產品類別數據是全球性的,根本不屬於會話。 –

+0

你說得對。我刪除了該行。 – NightOwl888