2010-03-08 5 views
1

Stackoverflow가 특정 사용자가 요청한 모든 질문을 검색 할 수있는 웹 서비스를 제공한다고 가정합시다. 요청은 다음과 같은 JSON 출력 될 수 있습니다 사용자 A의 모든 질문을 얻을 :웹 서비스의 데이터를 데이터베이스에 캐시하는 것이 좋은 생각입니까?

{ 
    { 
     "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. 사용자가 특정 질문에 대한 모든 대답을 원하고 다른 웹 서비스가 검색을 수행하고 로컬 데이터베이스에서이를 덤프합니다.
    3. 사용자가 로그 아웃 한 후 해당 사용자의 모든 질문과 답변을 로컬 데이터베이스에서 삭제하십시오.
  • 답변

    1

    당신이 당신의 생각이 성능에 유용 할 수있는 스마트 알고리즘을 구현하는 경우, 나는 생각한다. 요점은 서비스에서 가져 와서 데이터베이스에 저장해야하는 데이터 양을 결정하는 것입니다. 사용자가 로그인 할 때 많은 양의 데이터를 저장하고 db에 저장하는 것은 좋지 않은 생각이지만, 예를 들어 처음에는 절반을 db로 저장하고 나머지 절반을 사용해야하는 경우 가져 와서 저장할 수 있습니다.

    0

    데이터베이스가 격리되어 있고 예방 조치를 취하고 있고 SQL 인젝션 공격까지 다른 DB를 열지 않는 한 왜 현명하지 않겠는가? ...

    특히 데이터를 가져 와서 조작하기 위해 DB에 넣는 것이기 때문에.

    그러나 과도 할 수 있습니다. 메모리 내 DataSet을 사용하여 동일한 작업을 수행하고 DB에 대한 추가 저장을 할 수있는 것처럼 보일 수도 있지만,이 방법이 문제가없는 경우 DB를 사용할 수 있습니다.

    1

    나는 이렇게하지 않을 것이다. 사용자가 5,000 개의 질문을하면/로그인하면 초기 로그인이 오래 걸릴 것입니다. 캐시하려는 경우 요청 당 캐시합니다. 웹 서비스 드라이버 작성도 쉬울 것입니다.

    각 웹 서비스 호출을 사용자 고유의 로컬 함수 호출로 감싸십시오. 실제로 웹 서비스 호출을하기 전에 데이터베이스를 점검하여이 호출을 아직 완료했는지 확인하십시오. 사용 중이면 시간 초과가 만료되었는지 확인하십시오. 만료되었거나 서비스 호출을 설정하지 않은 경우 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(...)"); 
    } 
    
    +0

    요청 당 캐시하려면 어떤 기술을 사용해야합니까? 동시에 100 명의 사용자가 동시에 로그인하는 경우도있을 수 있습니다. –

    관련 문제