버전 2.0부터 Couchbase 서버는 뷰라는 개념을 통해 JSON 문서에 대한 인덱스를 생성하는 강력한 방법을 제공합니다.
보기를 사용하여 기본 인덱스, 복합 인덱스 및 집계를 정의하여 다음과 같은 작업을 수행할 수 있습니다:
다양한 JSON 속성에 대한 문서 쿼리
통계 및 집계 만들기
뷰는 구체화된 인덱스를 생성하므로 미리 정의된 쿼리를 실행하는 빠르고 효율적인 방법을 제공합니다.
그러나 Couchbase 2.x에서는 인덱스가 디스크에 저장되고 각 쿼리에 대해 디스크에서 읽혀지므로 성능에 약간의 영향이 있습니다.
향후 Couchbase는 쿼리 속도를 높이기 위해 JSON 문서에 대해 수행되는 것과 유사하게 관리형 캐시에 인덱스를 캐싱할 수 있도록 할 예정입니다.
한편, 이 블로그에서는 쿼리 결과를 디스크의 인덱스에서 제공하는 대신 캐시에서 검색할 수 있도록 Couchbase에 캐싱하는 방법에 대한 간단한 예제를 제공합니다.
이 기능은 인덱스에 대한 쿼리를 즉시 최신 상태로 유지할 필요는 없지만(몇 분 이상도 괜찮음) 자주(초당 여러 번) 읽어야 하는 시나리오에 유용합니다. 이 경우 쿼리 결과는 애플리케이션의 필요에 따라 가끔씩만 계산되고 나머지 시간에는 관리되는 캐시에서 읽혀집니다.
이에 대한 좋은 사용 사례 예는 게임 리더보드입니다. 특정 게임의 최고 점수에 대한 인덱스를 생성하는 데 뷰를 사용할 수 있으며, 해당 뷰는 몇 분마다(예: 5분) 쿼리되어 Couchbase Server에 캐시될 수 있습니다. 보기에 대한 모든 요청은 캐시된 값과 비교되므로 서버에서 인덱스 쿼리가 필요하지 않고 몇 초 밖에 걸리지 않습니다.
위의 방법은 인덱스 자동 업데이트와는 별개입니다. 기본적으로 Couchbase의 모든 인덱스는 5초마다 또는 5000개 업데이트마다 업데이트되며, 이 두 가지 모두 REST API를 통해 조정할 수 있습니다. 이에 대한 자세한 내용은 여기에서 확인하세요: http://www.couchbase.com/docs/couchbase-manual-2.1.0/couchbase-views-operation-autoupdate.html
즉, 인덱스는 최신 상태로 유지할 수 있지만 최신 상태일 필요가 없는 특정 쿼리는 캐싱하여 처리량을 높이고 대기 시간을 줄일 수 있습니다. 한 가지 주의할 점은 Couchbase에서 값의 최대 길이는 20MB이므로 캐시된 쿼리를 초대형 결과 집합에 사용해서는 안 된다는 점입니다(더 큰 집합의 경우 항상 결과를 여러 개의 캐시된 값으로 분할할 수 있지만).
구현은 매우 간단합니다. Java에서 이를 구현하는 방법을 살펴보겠습니다.
Couchbase 서버와 함께 제공되는 bee-sample 데이터베이스를 사용하겠습니다. 아직 설치하지 않았다면 설정으로 이동하여 맥주 샘플을 선택한 다음 생성을 클릭합니다:
여기에는 캐싱 예제를 빌드하는 데 사용할 brewery_beer 뷰가 함께 제공됩니다:
이제 쿼리를 실행 및 캐시하고 매번 쿼리를 실행하는 것과 비교하는 데 사용할 수 있는 간단한 Java 애플리케이션을 살펴 보겠습니다.
아래 자바 코드는 먼저 꿀벌 샘플 데이터베이스에 연결하고:
쿼리를 한 번 실행하고 캐시에서 n번 읽거나
쿼리를 n번 실행합니다.
두 경우 모두 실행 시간을 측정하기 위해 전후에 타이머가 시작됩니다.
이 코드는 매우 간단하며 쿼리에 매개변수를 사용하지 않고 includeDocs를 사용하여 쿼리 결과와 관련된 모든 JSON 문서를 검색하는 대신 문서 ID만 검색합니다.
Couchbase의 보기 및 쿼리에 대해 자세히 알아보려면 다음을 참조하세요: http://www.couchbase.com/docs/couchbase-devguide-2.1.0/indexing-querying-data.html
전체 소스 코드는 다음과 같습니다:
// @저자 Alexis Roos
com.couchbase.dev.examples;
com.couchbase.client.CouchbaseClient를 가져옵니다;
com.couchbase.client.protocol.views.*를 가져옵니다;
java.net.URI를 가져옵니다;
java.util.LinkedList를 가져옵니다;
java.util.List를 가져옵니다;
공용 클래스 CachedQuery {
public static void main(String args[]) {
목록 uris = 새 LinkedList();
uris.add(URI.create("http://127.0.0.1:8091/pools"));
카우치베이스클라이언트 클라이언트 = null;
시도 {
client = 새 CouchbaseClient(uris, "beer-sample", "");
int requestCount = 100;
double t1 = System.currentTimeMillis();
보기 보기 = client.getView("beer", "brewery_beers");
쿼리 쿼리 = 새 쿼리();
query.setIncludeDocs(true).setLimit(10000);
query.setStale(Stale.FALSE);
// 쿼리를 한 번만 수행하고 캐싱하기
ViewResponse 결과 = client.query(view, query);
client.set("cachedBrewery_beersQuery", 0, result.toString());
// 후속 요청에 캐시 사용
for (int i = 0; i < requestCount - 1; i++) {
String cachedIndex = (String) client.get("cachedBrewery_beersQuery");
}
double t2 = System.currentTimeMillis();
System.out.println("캐시로 테스트 완료" + (t2 - t1) / 1000 + " 초");
t1 = System.currentTimeMillis();
// 매번 쿼리하기
for (int i = 0; i < requestCount; i++) {
결과 = client.query(보기, 쿼리);
}
t2 = System.currentTimeMillis();
System.out.println("캐시 없는 테스트는 " + (t2 - t1) / 1000 + " 초 만에 완료되었습니다.");
client.shutdown();
} catch (Exception e) {
System.err.println("카우치베이스에 연결하는 동안 오류가 발생했습니다: " + e.getMessage());
System.exit(0);
}
}
}
코드를 실행하면 100개의 직렬 쿼리에 대해 두 가지 테스트 결과가 모두 출력됩니다:
3.755초 만에 캐시 테스트 완료
캐시 없는 테스트는 19.835초 만에 완료되었습니다.
캐시를 사용한 테스트는 훨씬 빠를 뿐만 아니라 Couchbase 서버에서 더 적은 리소스를 필요로 합니다.
다음 그래프는 맥주 샘플 버킷의 초당 작업 수 지표를 보여주며, 첫 번째 작은 범프는 캐시를 사용한 테스트(쿼리가 한 번만 실행되므로 기본적으로 양조장 및 맥주에 대한 문서 수에 매핑됨)에 해당하지만 나머지 큰 곡선은 쿼리가 여러 번 실행되어 초당 작업 수가 더 많았음을 보여줍니다.
뷰 쿼리에 캐싱을 사용하는 것은 간단하며, 주기적으로 뷰를 쿼리하고 그 결과를 Couchbase 서버에 저장하여 캐싱하는 프로그램을 설정하는 것도 간단합니다. 그러면 애플리케이션은 이 캐시된 값을 사용하여 효율성을 높일 수 있습니다.
애플리케이션 사용 사례에 따라 적절하게 사용해야 합니다.
좋은 게시물이며 좋은 해결 방법인 것 같습니다.
이 기능은 언제 제품에 내재화될 예정인가요?
\"앞으로 Couchbase는 쿼리 속도를 높이기 위해 JSON 문서에 대해 수행되는 것과 유사하게 관리형 캐시에 인덱스를 캐싱할 수 있도록 할 것입니다."
고마워요
알렉스 님, 답변이 늦어져서 죄송합니다. 조회수(및 기타 인덱스) 속도를 높이기 위해 여러 가지 작업을 진행 중입니다. 내년 하반기에는 꽤 큰 폭의 개선이 이루어질 것으로 예상됩니다.
페이지 매김을 통해 결과를 살펴보는 것이 캐시된 결과에 어떤 영향을 미치나요?
캐시된 결과는 실제 뷰 쿼리와는 별개입니다. 보기를 통해 페이지 매김을 하는 경우 각 '페이지'를 별도의 문서로 캐시하게 되므로 특정 페이지를 원할 때 어느 페이지를 가져와야 하는지 알아야 합니다. 결과 집합의 크기에 따라 약간 달라질 수 있습니다... 하나의 문서에 더 많은 수의 결과를 저장한 다음 애플리케이션을 사용하여 구문 분석/페이지 매김하는 것이 더 효율적일 수 있습니다.
도움이 되었나요?