2010-03-08 21 views
1

我們假設Stackoverflow提供了Web服務,您可以在其中檢索特定用戶提出的所有問題。請求獲得來自用戶A的所有問題,可能會導致以下JSON輸出:將Web服務中的數據緩存到數據庫中是個好主意嗎?

{ 
    { 
     "question": "What is rest?", 
     "date_created": "20/02/2010", 
     "votes": 1, 
    }, 
    { 
     "question": "Which database to use for ...", 
     "date_created": "20/07/2009", 
     "votes": 5, 
    }, 
} 

如果我想操縱和我想的任何方式呈現數據,會是明智的,傾倒在當地數據庫?在某些時候,我還想要檢索每個問題的所有答案並將它們存儲在本地數據庫中。

,我正在考慮的工作流程是:在

  • Web服務檢索由登錄的用戶提出的所有問題

    1. 用戶登錄,甩掉他們在本地數據庫。
    2. 用戶想要一個特定問題的所有答案,另一個Web服務執行檢索並將其轉儲到本地數據庫中。
    3. 用戶註銷後,從本地數據庫中刪除該用戶的所有問題和答案。
  • 回答

    1

    如果您實現了智能算法,我認爲您的思想對性能有用。重點是確定您應該從服務中獲取多少數據並保存到數據庫中。拿這麼多的數據並在用戶登錄時將其保存到數據庫是個不錯的主意,但是,例如,您可以先將其中的一半數據保存在數據庫中,另一半使用時,可以將其保存。

    0

    我不明白爲什麼這是不明智的,只要數據庫是孤立的,你正在採取預防措施,並且你正在做的事情不會打開一些其他數據庫直到SQL注入攻擊...

    尤其是因爲您只是將數據放入數據庫中進行操作。

    但是,這可能是矯枉過正。在我看來,你可以用內存數據集做同樣的事情,並保存到數據庫的額外旅程,但如果這對你有用,我沒有看到它的問題。

    1

    我不會這樣做。如果用戶詢問/回答了5,000個問題,它將使初始登錄永久。如果你想緩存,每個請求緩存。它也會使編寫Web服務驅動程序更容易。

    用您自己的本地函數調用來包裝每個Web服務調用。在實際進行Web服務調用之前,請檢查數據庫以查看是否已完成此調用。如果有,請檢查超時以查看是否過期。如果過期,或者沒有設置做服務調用,並存儲到數據庫。

    編輯

    一些僞代碼。函數名稱組成:

    string get_question(questionId) 
    { 
    
    
        SQL = " SELECT data FROM cache 
             WHERE service='StackOverflow' 
             AND proceedure='get_question' 
             AND username='?' 
             AND parameters = '?' 
             AND updated > DATEADD(h, ?, GETDATE())"; 
    
        // check to see if it exists in db and is not expired 
        question = db(SQL, currentUser(), questionId, 2); // single parameter is question id, 2 hour timeout 
    
        // if question is not null, then return the question from the cache. 
        if (question != NULL && question != "") 
        { 
        return question; 
        } 
    
        //otherwise do the webservice call to get the data. 
        question = WebServiceCall('get_question',questionId); 
    
        // store to database, delete if exists first. 
        db("DELETE from cache where service='StackOverflow' AND proceedure='get_question' AND username='?' AND parameters = '?'", currentUser(), questionId, 2 
        db("INSERT INTO cache (service,procedure,parameters,username,data) VALUES(...)"); 
    } 
    
    +0

    我應該使用哪種技術來緩存每個請求?我也可以有幾百個用戶同時登錄的情況。 – 2010-03-08 21:18:29

    相關問題