我正在爲我的網頁遊戲編寫一個C#HTTP請求服務器,並且正在使用MongoDB作爲數據庫。仍然可以在C#應用程序中緩存任何內容,效率更高嗎?或者,對於每件事情都只需要向MongoDB發出請求就會更快。我期望每個活動播放器每分鐘有十幾個選擇查詢,並且可能每分鐘有一個或兩個保存/更新查詢。 「與MongoDB一樣,緩存與MySQL一樣重要嗎?
回答
」每個活躍玩家每分鐘打幾十個選擇查詢「不會告訴我們任何事情。爲了獲得任何方位,我們需要知道活動播放器的數量,每個查詢所採用的時間量,表結構,正在使用的查詢(包括返回的數據量),服務器負載統計數據以及其他因爲您是否正在使用Mongo的功能來分割數據庫等。
無論如何,在設置任何類型的緩存之前,我都強烈建議您從分析系統開始。你需要知道你的瓶頸在哪裏,如果有的話。這不是你只是猜測,你需要硬性和真實的統計數據。
根據手中的信息,你可以做一個判斷,你是否需要
- 作出輕微修正你的代碼
- 實現某種類型的緩存策略
- 的分片在多個數據庫服務器服務器
- 重新構建的代碼大片
- 規模達(購買更大的服務器)
- 或甚至修復內部網絡問題。
要點是,不要開始緩存的東西,希望在稍後獲得性能增加。取決於大量因素,緩存可能會提高性能,因爲它會殺死它。
在這裏添加一個其他的東西。如果您使用Web服務器場來託管您的請求服務器,那麼將數據緩存到每個獨立Web服務器所涉及的複雜性和硬件成本就會急劇增長。
當嘗試將數據緩存在這些機器的內存中時,硬件成本會上升,因爲您的Web服務器上的內存需求增加。
當試圖保持緩存副本同步時,複雜性會增加,以免它們過時。我會想象,一場比賽將要求信息,百分之百目前。像Facebook和其他網站可能會有點不同步。當遊戲服務器不同步時,可能會對玩家的可用性產生負面影響。
假設您目前只部署到單個Web服務器和單個數據庫服務器,如果您遷移到多個Web服務器和/或多個數據庫,添加緩存功能現在可能會對您造成巨大的痛苦服務器。
最後,如果由於某種原因,您只部署到承載數據庫和Web服務器的單臺機器,那麼緩存是完全可笑的。
我會說,不管數據庫如何,緩存很少更改服務器上的數據比製作一堆數據庫調用要好。任何可以直接通過網絡從網絡服務器發送數據庫呼叫然後通過網絡發送的東西是件好事。如果你正在做的十幾個選擇查詢返回相同的數據,最好緩存它。
聽起來不錯......直到你意識到MongoDb本身被定位爲緩存存儲:http://www.mongodb.org/display/DOCS/Use+Cases考慮到這一點,緩存緩存似乎有點多餘。 – NotMe
與@Chris合作... MongoDB的目標之一是讓數據庫的功能更接近Memcached的緩存。 因此,使用緩存作爲「第一步」不僅會擊敗(某些)MongoDB的重點,而且它也可能不是您的RAM的最佳使用。 MongoDB將在RAM中存儲儘可能多的數據(使其與緩存幾乎一樣快),所以如果你在中間還有一個競爭緩存,你可能會吃掉你所有的RAM,像糖果。 –
這裏有一些需要考慮的事情:當你的遊戲很小時,你的數據庫可能會在同一臺機器上,而數據庫本身會自己緩存。稍後如果你的遊戲很流行,你最終會得到多個Web服務器,如果你想提高整體內存效率,最好使用像memcached這樣的分佈式緩存。
- 1. 與MongoDB一樣,MySQL是否有TTL?
- 2. ftp.storbinary與ftp.retrbinary不一樣嗎?
- 3. WCF像WebServices一樣緩存
- 4. MongoDB與使用報告樣式查詢的RDBMS一樣高效嗎?
- 5. 多重讓保護陳述與單一讓步一樣嗎?
- 6. AS3 - 「\ u2605」與「\\ u」+「2605」不一樣嗎?
- 7. 是window.load()與.load()在jQuery中一樣嗎?
- 8. 與python/PIL中ImageMagick的「-level」一樣嗎?
- 9. Ie6 * lat與1000000 * lat不一樣嗎?
- 10. b2Body與CCSprite的大小不一樣嗎?
- 11. F#與Haskell的where子句一樣嗎?
- 12. FetchType EAGER與Root fetch()不一樣嗎?
- 13. MongoDB:像MySQL一樣顯示數據庫
- 14. 「int」真的需要至少與C中的「short」一樣大嗎?
- 15. .NET Artchitecture的作品一樣 - 緩存的一切,從緩存中
- 16. NSSortDescriptor與兩個同樣重要的鍵
- 17. 將樣式表與重疊樣式結合在一起?
- 18. NSData圖像在內存中的重量與打開的圖像一樣多嗎?
- 19. CKRecordID與'AnyObject'不一樣
- 20. 光標與Jellybean不一樣?
- 21. 'Int'與'String'不一樣 - Swift
- 22. NSNumber與其floatValue不一樣
- 23. Coverflow與jQuery一樣效果
- 24. SQL與CodeIgniter中的一樣
- 25. '@lvalue $ T7'與'CGPoint!'不一樣
- 26. CloudFlare不應該與「緩存一切」緩存所有內容嗎?
- 27. 與win32一樣構建與x86
- 28. BusinessObject的IEnterpriseSession可以像db連接一樣被緩存嗎?
- 29. MySQL是像SELECT一樣昂貴的嗎?
- 30. 像Python一樣,我需要node.js嗎?
閱讀完編輯之後,我決定忽略緩存,直到完成遊戲的第一個發行版。我無法分辨目前緩存會產生什麼影響,所以在遊戲準備就緒時看看它是否有幫助會更有意義。 如果我完成了遊戲並且需要擴展遊戲以便能夠處理更多用戶,那麼在分析優化時,分片是一種快速有效的方法來解決問題? – Barakat
@Barakat:分片涉及設置額外的mongo數據庫服務器並在集羣中配置它們,以便每個分擔負載。這具有許多優點,包括消除單點故障。所以,在我考慮任何類型的緩存場景之前,我會對其進行調查。 – NotMe