한 번에 많은 양의 레코드를 보유 할 수있는 데이터 캐싱 시스템을 설계하고 있으며 사용할 컨테이너와 사용 방법을 알아야합니다. 응용 프로그램에는 사용자를위한 매우 큰 DB 레코드가 있습니다. 시스템에 로그인 할 때 사용자 이름 및 몇 가지 중요한 속성과 같은 일부 데이터를 기록하고 캐시하려고합니다. 그들은 시스템과 상호 작용하면서 해당 속성을 업데이트하고 액세스합니다. 몇몇 속성은 매우 휘발성이며 많은 트랜잭션이있는 DB에서 "치는"현상을 피하기 위해이 작업을 수행하고 있습니다. 또한 필자는 정렬이나 기타 용도로 데이터베이스를 사용할 필요가 거의 없다 - 필자는 영광스러운 바이너리 저장 파일 (이 때문에 메모리에 레코드를 캐시하는 것이 행복하다)과 같이 이것을 사용하고있다. 나를 위해 더 중요한 목표는 엄청난 수의 사용자로 확장 할 수 있다는 것입니다.MySQL DB에서 캐싱 데이터 - 기술 및 적절한 STL 컨테이너?
사용자가 로그 아웃 할 때 서버가 종료되거나 이 라운드 로빈 방식으로 (주기적으로)으로 주기적으로 데이터를 DB에 기록하려고합니다.
서버는 자체 유지 :
UserData를 유지하는 DB를에서 사용자 이름 (문자열) 및 기타 속성 같은 것들뿐만 아니라, 네트워크 핸들 같은 다른 임시 데이터와vector <UserData *> loggedInUsers;
.
이 벡터에서 특정 사용자를 찾으려면 가장 빠른 방법이 있습니까?이 작업을 수행하는 데 사용할 수있는 다른 컨테이너가 있습니까? 지금 내가하는 일은 iterator를 만들고, loggedInUsers.begin()에서 시작하여 .end()에 반복하여 * iter-> username == "foo"를 확인하고 발견되면 반환하는 것입니다. 사용자 이름이 벡터 끝에 있거나 벡터에 5000 명의 사용자가있는 경우 이는 상당한 지연입니다.
내 두 번째 질문은이 데이터를 DB에 다시 쓰도록 라운드 로빈 방식으로 예약 할 수 있습니까? DB에 몇 개의 레코드를 쓸 준비가 될 때마다 함수를 호출 할 수 있습니다. 하지만 벡터에 반복자를 넣을 수는 없으므로 무효화됩니다. 내가하고 싶은 것은 큐의 헤드에 액세스 할 수있는 순환 큐를 DB에 유지 한 다음 큐의 끝으로 회전시키는 것입니다. 오버 헤드가 많은 것처럼 보입니다. 어떤 형식으로이 작업을 더 잘 수행 할 수 있습니까?
제 3의 질문은 MySQL 서버와 libmysqlclient connector/C ..를 사용하고 있습니다.이 문제를 "무료"로 해결할 수있는 캐싱이 내장되어 있습니까? 아니면 전혀 다른 기술이 있습니까? 제안에 대한 답변을드립니다.
A1 : 감사합니다. A2 : 끌어 오기/밀기의 성능은 어떻습니까? 각 작업에서 내가 새 요소를 버리고 추가한다고 가정 할 것입니까? 단지 '회전'하도록 만들어진 데이터 구조체가 있습니까? A3 : 여러 앱이 DB에 충돌 할 수 있습니다. 더 큰 질문을 따르십시오 : A1과 A2 나는이 모든 데이터를지도에 담아서 DB를 통해 업데이트를 지속하기 위해 회전 할 수 있도록 결합해야합니다. 어떻게 할 수 있습니까? – Nektarios
A3에 대해 유감스럽게 생각합니다. SQLite를 메모리 내에서 데이터 구조로 사용할 것을 제안합니다. 그것은 실제로 좋을 것입니다. – Nektarios