将数据从Web服务缓存到数据库中是一个好主意吗?

时间:2010-03-08 21:04:35

标签: database web-services caching software-design

假设Stackoverflow提供Web服务,您可以在其中检索特定用户提出的所有问题。从用户A获取所有问题的请求可能导致以下json输出:

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

如果我想以任何我想要的方式操作和呈现数据,将它转储到本地数据库中是否明智?在某些时候,我还想检索每个问题的所有答案,并将它们存储在本地数据库中。

我在想的工作流程是:

  1. 用户登录。
  2. Web服务检索登录用户提出的所有问题,将其转储到本地数据库中。
  3. 用户想要特定问题的所有答案,另一个Web服务进行检索并将其转储到本地数据库中。
  4. 用户注销后,从本地数据库中删除该用户的所有问题和答案。

3 个答案:

答案 0 :(得分:1)

我不会这样做。如果用户询问/回答了5,000个问题,则会使初始登录永久进行。如果要缓存,请按每个请求缓存。它还可以更轻松地编写Web服务驱动程序。

使用您自己的本地函数调用包装每个Web服务调用。在实际进行Web服务调用之前,请检查数据库以查看您是否已完成此调用。如果有,请检查超时以查看它是否已过期。如果已过期,或未设置执行服务调用,则存储到db。

修改

一些伪代码。功能名称组成:

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(...)");
}

答案 1 :(得分:1)

如果您实施智能算法,我认为您的想法对性能有用。关键是要确定应从服务中获取多少数据并保存到数据库中。在用户登录时获取如此多的数据并将其保存到数据库是一个坏主意,但是你可以,例如,首先将其中一半保存在数据库中,当应该使用另一半时,你可以采取并保存它。

答案 2 :(得分:0)

我不明白为什么这是不明智的,只要数据库被隔离,你就采取了预防措施,而你所做的事情并没有打开其他数据库直到SQL注入攻击......

特别是因为您只是将数据放入数据库中进行操作。

然而,这可能是矫枉过正的。在我看来,你可以使用内存中的数据集做同样的事情,并节省额外的数据库访问,但如果这对你有用,我看不出有问题。