2014-01-31 27 views
0

我在VPS上運行應用程序(基於PHP & MySql)。我有文章表,其中有數百萬條記錄。每當用戶登錄我顯示每個部分的最後50個記錄。在PHP中加速緩存

因此,每次使用登錄或刷新頁面,它正在執行sql查詢來獲取這些記錄。現在網站上有很多用戶,因爲我的網頁速度已經大幅下降。

我做了一些關於緩存的研究,發現我可以根據節讀取mysql數據,不。文章例如(第1節和第50條)。將其存儲在磁盤文件緩存/ md5(部分號碼)中。

然後在未來,當我得到該部分的請求只是從cache/md5(部分號)獲取數據。

以上解決方案看起來不錯。但在我繼續之前,我真的想澄清一些下面的專家的疑惑。

  • 才能真正加快我的應用程序(我知道磁盤IO比MySQL查詢速度快,但不知道有多少。)
  • 我目前使用我的網頁上分頁狀顯示第5篇文章,當用戶點擊在「顯示更多」,然後顯示接下來的5篇文章等...這可以很容易地在MySQL查詢。如果我將所有記錄(50)存儲在緩存文件中,我不知道該如何做。如果有人能分享一些很棒的信息。
  • 任何替代解決方案,如果你相信上述不會奏效。
  • 任何開源應用程序,如果你知道。 (PHP)

預先感謝您

問候, 拉吉

回答

0

我跑進其中2+查詢每一個頁面加載的結果是運行同樣的問題。值得慶幸的是,他們非常類似的查詢被反覆運行,所以緩存(就像你的情況)非常有幫助。

你有幾個選擇:

  1. 卸載數據庫到同一網絡上的單獨VPS以它的規模向上和向下根據需要

  2. 緩存每個查詢的數據,並嘗試在訪問數據庫之前從緩存中檢索

最後,我們選擇了兩個,安裝Memecached及其php擴展以實現查詢緩存目的。 Memecached是一個鍵值存儲(與PHP的關聯數組非常相似),每個存儲的值都以秒爲單位測量設置的到期時間。由於它將所有內容存儲在RAM中,所以對易失性高速緩存數據的權衡是非常快的讀取/寫入時間,比文件系統好得多。

我們的實現基本上是通過過濾器來運行每個查詢;如果它是一個select語句,通過將memecached鍵設置爲「namespace_ [md5 of query]」並將該值設置爲具有所有結果行的數組的序列化版本來緩存它。緩存120秒(3分鐘)應該足以幫助解決服務器負載。

+0

謝謝TheLonelyGhost ...感謝您的迴應。我想過使用memcached,但我限制了我的VPS。我只有8GB內存。目前,PHP/MYSQL使用它的80%。所以我認爲這對我來說不是一個好的選擇,直到我轉移到不同的主機或專用服務器時,使用更多像16到32GB的內存。 – SmartDev

+0

它儘可能利用緩存的一部分。運行2或3個更簡單的已經被緩存的選擇查詢會比連接這些表的單個查詢更好。如果沒有別的,嘗試像緩存整個頁面的清漆一樣的解決方案。 – TheLonelyGhost

0

如果Memecached不是一個可行的解決方案,則將每個部分的全部50篇文章作爲RSS源存儲。您可以一次拉出所有文章,使用SimpleXML獲取每篇文章的內容,並根據網站設計將其包裝在您網站的文章模板HTML中。一旦數據存在,使用CSS樣式僅顯示X篇文章,使用JavaScript進行分頁。

由於兩個進程在同一時間修改同一個文件將是一個壞主意,因此向段添加新故事會觸發事件,這會將故事添加到消息隊列中。該消息隊列會由工作人員該做連續的兩件事情,也使用SimpleXML進行處理:

  1. 刪除最古老的故事在XML文件

  2. 的末尾添加從消息給出一個新的故事排隊到XML文件的頂部

如果您願意,根據部分的RSS提要可能是一個面向公衆的功能。