MongoDB는 인기 있는 NoSQL 특히 현대를 위한 데이터베이스 . NET 응용 프로그램. 그러나 여전히 디스크 기반이어서 유연성에도 불구하고 트래픽이 많은 상황에서 성능 문제가 발생할 수 있습니다. 확장 성, 강력한 질의 기능. 여기가 바로 NCache분산형 인메모리 캐싱 솔루션이 등장했습니다.
도입 NCache MongoDB용 캐싱 계층으로 사용하면 .NET 애플리케이션에서 데이터베이스 쿼리 횟수를 대폭 줄이고 응답 시간을 향상시키며 높은 트랜잭션 볼륨을 효율적으로 관리할 수 있습니다. 이 문서에서는 통합 방법을 설명합니다. NCache MongoDB를 사용하여 쿼리 결과 캐싱을 위한 모범 사례와 캐시 및 데이터베이스를 동기화 상태로 유지하는 전략에 대해 알아봅니다.
이 가이드는 MongoDB 데이터를 캐싱해야 하는 시점, 캐싱해서는 안 되는 데이터, 그리고 .NET 애플리케이션이 캐시와 데이터베이스를 안전하게 동기화하는 방법을 설명합니다. 특히 읽기 작업이 많은 API, 대시보드, 트래픽이 높은 마이크로서비스에 유용합니다. 요약하자면, MongoDB는 여전히 주요 데이터 저장소 역할을 하며, NCache 고속 인메모리 읽기 계층 역할을 합니다.
주요 요점
- MongoDB는 디스크 기반 데이터베이스입니다. 이는 종종 트래픽이 많은 .NET 애플리케이션의 성능 병목 현상이 됩니다. 바로 이럴 때 인메모리 캐싱 계층을 사용하면 데이터베이스 부하를 크게 줄일 수 있습니다.
- NCache MongoDB용 인메모리 분산 캐시 역할을 합니다. 자주 액세스하는 데이터를 데이터베이스 대신 캐시에서 제공할 수 있도록 하여 성능을 향상시키고 확장성을 개선합니다.
- 클라이언트 캐시 NCache InProc 속도를 제공합니다 애플리케이션 프로세스 내부에 있으면서도 분산 캐시와 동기화 상태를 유지하기 때문에 애플리케이션에 유용합니다.
- 캐시사이드 패턴은 일반적으로 사용됩니다. MongoDB를 사용하는 경우 애플리케이션은 먼저 확인합니다. NCache 데이터를 가져온 다음 캐시에서 찾을 수 없는 경우에만 MongoDB로 이동합니다.
- MongoDB 변경 스트림을 사용하면 캐시 데이터를 동기화 상태로 유지할 수 있습니다. MongoDB에서 문서가 삽입, 업데이트 또는 삭제될 때마다 실시간 캐시 업데이트를 활성화합니다.
- NCache 캐시된 MongoDB 데이터에 대해 SQL 스타일 쿼리를 허용합니다. 이를 통해 MongoDB에 직접 쿼리하지 않고도 캐시된 객체를 더욱 효율적으로 필터링하고 검색할 수 있습니다.
- 전체 컬렉션 또는 개별 문서를 캐싱하는 것은 액세스 패턴에 따라 달라집니다. 대량 캐싱은 일괄 읽기 속도를 향상시키는 반면, 태그를 사용한 항목별 캐싱은 세밀한 제어와 선택적 무효화를 가능하게 합니다.
- NCache MongoDB를 사용하는 .NET 애플리케이션에 매우 적합합니다. .NET 객체 캐싱 및 읽기 통과(Read-Through), 쓰기 지연(Write-Behind)과 같은 서버 측 캐싱 기능을 제공합니다.

그림: MongoDB를 사용한 분산 캐시
MongoDB 성능 향상에 캐싱이 중요한 이유는 무엇일까요?
.NET 애플리케이션에 다음과 같은 이유가 있습니다.
- 유연한 문서 기반 스토리지: 스키마 없는 디자인으로 인해 데이터 구성이 간소화됩니다.
- 분산 아키텍처: 사용함 복제 파티셔닝 확장성을 위해.
- 색인 & 집계 프레임워크: 복잡하게 만든다 쿼리 실력 있는.
- 변경 스트림: 변경 스트림을 통해 실시간 데이터 수정 사항을 캡처합니다.
MongoDB 성능 병목 현상
다음과 같은 성능 문제가 있습니다.
- 읽기/쓰기 지연 및 디스크 I/O 오버헤드: MongoDB는 디스크 기반 데이터베이스이므로 빈번한 읽기 및 쓰기 작업은 메모리 내 솔루션에 비해 더 높은 대기 시간으로 이어집니다. 데이터 볼륨이 증가함에 따라 디스크 I/O 오버헤드가 증가하여 응답 시간과 전반적인 시스템 성능에 영향을 미칩니다.
- 대규모 데이터 세트 쿼리: 데이터 세트 크기가 증가하면 더 많은 문서를 스캔하고 처리하는 데 시간이 더 오래 걸리므로 쿼리 실행 시간이 증가합니다. 색인 이런 측면에서 유용하지만, 특히 대량의 데이터를 필터링하거나 집계할 때 항상 충분한 것은 아닙니다.
- 확장성 도전 과제 : 샤딩을 사용한 수평 확장에 대한 기본 지원이 있지만 거대한 클러스터를 처리하면 복제가 발생할 수 있습니다. 로드 밸런싱, 그리고 네트워킹 복잡성. 트래픽 볼륨이 증가함에 따라 성능 최적화가 중요해집니다.
- 자주 액세스되는 데이터에 대한 높은 대기 시간: 자주 액세스하는 데이터에 대한 쿼리는 더 빠른 스토리지 계층에서 제공되지 않고 반복적으로 데이터베이스에 도달하면 성능 저하로 이어질 수 있습니다. 이로 인해 리소스 활용도가 증가하고 응답 시간이 지연됩니다.
사용의 이점 NCache 몽고DB와 함께
NCache, 메모리 내 분산 캐시, MongoDB 애플리케이션에 가장 적합한 옵션입니다.
- 메모리 내 성능: NCache 100% 메모리 내 캐싱 솔루션으로 디스크 I/O를 제거하고 매우 낮은 지연 시간을 보장하여 데이터 검색 속도를 높여줍니다.
- 클라이언트 캐시(InProc 속도): 애플리케이션 프로세스 내부의 애플리케이션 서버에 상주하여 네트워크 호출을 최소화하고 빠른 액세스를 보장합니다.
- 선형 확장 성: 데이터 부하가 증가함에 따라 캐시 서버를 추가하여 동적으로 확장함으로써 병목 현상을 방지하고 높은 성능을 보장합니다.
- 고 가용성: 자동 복제 및 장애 조치를 통해 중단 없는 액세스를 보장하고, 서버 장애 중에도 캐시가 작동 상태를 유지합니다.
아키텍처: MongoDB에서 캐싱이 작동하는 방식 NCache
NCache 동적 아키텍처로 인해 애플리케이션에 완벽하게 들어맞습니다.
단계별 가이드: MongoDB 캐싱 구현하기 NCache
MongoDB 캐싱을 쉽게 구현할 수 있습니다. NCache 아래에 표시된 대로:
MongoDB에서 쿼리 결과 캐싱
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
ICache cache = CacheManager.GetCache("MongoDBCache"); string cacheKey = "Customer:EINSTEIN"; Customer customer = cache.Get<Customer>(cacheKey); if (customer == null) { var collection = new MongoClient("mongodb://your-mongodb-url") .GetDatabase("ECommerceDB") .GetCollection<Customer>("Customers"); customer = await collection.Find(x => x.Id == "EINSTEIN").FirstOrDefaultAsync(); if (customer != null) { cache.Insert(cacheKey, new CacheItem(customer) { Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)) }); } } |
MongoDB 컬렉션을 단일 항목으로 캐싱
MongoDB 컬렉션을 쉽게 캐싱할 수 있습니다. 전체 컬렉션을 단일 캐시 항목으로 저장하면 한 번의 작업으로 빠르게 검색할 수 있어 캐시 조회 횟수를 줄이고 배치 처리 또는 UI 렌더링 성능을 향상시킬 수 있습니다.
|
1 2 3 4 5 6 7 8 9 10 |
var customersInGermany = await collection.Find(x => x.Country == "Germany").ToListAsync(); if (customersInGermany.Count > 0) { ICache cache = CacheManager.GetCache("MongoDBCache"); var cacheItem = new CacheItem(customersInGermany) { Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(10)) }; cache.Insert("Customers:Germany", cacheItem); } |
MongoDB 컬렉션 항목을 개별적으로 캐싱하기
MongoDB 컬렉션은 쉽게 캐싱할 수 있습니다. 각 항목을 개별적으로 저장하면 개별적인 접근이 가능하며, 태그를 사용하여 관련 항목을 그룹화하면 대량 검색 속도가 향상되고 쿼리 성능도 개선됩니다.
|
1 2 3 4 5 6 7 8 9 |
foreach (var customer in customersInGermany) { var cacheItem = new CacheItem(customer) { Tags = new Tag[] { new Tag("Customer:Country:Germany") }, Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(10)) }; cache.Insert($"Customer:CustomerID:{customer.Id}", cacheItem); } |
변경 스트림을 사용하여 캐시와 데이터베이스를 동기화 상태로 유지하세요.
MongoDB와 캐시 간의 데이터 일관성을 보장하기 위해 변경 스트림은 다음을 감지하여 실시간 동기화를 허용합니다. 삽입, 업데이트예산 및 삭제. 데이터가 변경될 때마다 NCache 오래된 데이터 문제를 방지하려면 해당 캐시 항목을 제거하거나 업데이트할 수 있습니다.
|
1 2 3 4 5 6 7 8 9 |
var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<Customer>>() .Match("{ operationType: { $in: ['insert', 'update', 'replace', 'delete'] } }"); var cursor = collection.Watch(pipeline); await cursor.ForEachAsync(change => { string cacheKey = $"Customer:CustomerID:{change.FullDocument.Id}"; cache.Remove(cacheKey); }); |
캐시된 데이터 쿼리 NCache
NCache 사용자가 SQL 쿼리를 사용하여 캐시된 데이터를 쿼리할 수 있게 하여 데이터베이스 부하를 줄이는 동시에 애플리케이션 성능을 개선합니다. 인덱싱된 쿼리는 캐시된 객체에 대한 더 빠른 조회 및 필터링을 가능하게 합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Connect to NCache ICache cache = CacheManager.GetCache("MongoDBCache"); // Define NCache search query string query = "SELECT * FROM Models.Customer WHERE Country = ?"; var queryCommand = new QueryCommand(query); queryCommand.Parameters.Add("Country", "Germany"); // Execute query on cache ICacheReader reader = cache.SearchService.ExecuteReader(queryCommand); while (reader.Read()) { string contactName = reader.GetValue<string>("ContactName"); Console.WriteLine($"Contact Name: {contactName}"); } |
구성 방법 NCache MongoDB에 대해서는요?
구성하려면 NCache MongoDB의 경우 다음 단계를 따르세요.
A. 설치 NCache Client
설치하려면 NCache .NET 애플리케이션의 클라이언트에서 NuGet을 사용하여 필요한 패키지를 추가합니다.
|
1 |
Install-Package Alachisoft.NCache.SDK |
설치가 완료되면 응용 프로그램을 사용하도록 구성하세요. NCache 데이터 캐싱을 위해.
나. 설치 NCache 서버
설치하려면 NCache Linux의 서버:
|
1 2 3 |
docker pull alachisoft/ncache:latest docker run -d --name ncache-server --network host alachisoft/ncache:latest docker exec -it ncache-server ncache service start |
C. 구성 NCache 몽고DB를 위해
MongoDB를 통합하려면 NCache, 다음과 같이하세요:
- 캐시 생성 및 구성:
|
1 2 |
New-Cache -Name MongoDBCache -Size 1024 -Topology PartitionReplica -Server 192.168.1.2 Add-Node -CacheName MongoDBCache -Server 192.168.1.3 |
- .NET 애플리케이션을 수정하여 사용 NCache:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
ICache cache = CacheManager.GetCache("MongoDBCache"); var collection = new MongoClient("mongodb://your-mongodb-url") .GetDatabase("ECommerceDB") .GetCollection<Customer>("Customers"); var customer = await collection.Find(x => x.Id == "EINSTEIN").FirstOrDefaultAsync(); if (customer != null) { cache.Insert("Customer:EINSTEIN", new CacheItem(customer) { Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(10)) }); } |
맺음말
사용 NCache MongoDB를 사용하면 데이터베이스 부하를 줄이고, 응답 시간을 개선하고, 실시간 데이터 일관성을 보장하여 애플리케이션 성능을 향상할 수 있습니다. 메모리 내 캐싱을 활용하면 애플리케이션은 더 빠른 데이터 액세스, 더 낮은 대기 시간, 원활한 확장성의 이점을 누릴 수 있습니다. NCache분산 아키텍처는 높은 가용성을 제공하고 장애 내구성을 보장하므로 MongoDB를 활용하는 최신의 트래픽이 많은 .NET 애플리케이션에 이상적인 선택입니다.
자주 묻는 질문 (FAQ)
Q: 왜 사용하나요? NCache MongoDB가 이미 확장성이 뛰어나다면요?
A: MongoDB는 확장성이 뛰어나지만, 결국 디스크 I/O가 병목 현상을 일으키게 됩니다. NCache 읽기 작업이 많은 트래픽을 메모리로 오프로드하여 속도를 크게 향상시키고, 데이터베이스가 쓰기 작업과 복잡한 쿼리에 집중할 수 있도록 합니다.
Q: 캐시는 어떻게 데이터베이스와 동기화 상태를 유지하나요?
A: 섹션 6에 자세히 설명된 바와 같이, NCache MongoDB Change Streams를 활용하여 데이터베이스의 실시간 업데이트를 수신하고 그에 따라 캐시된 항목을 무효화하거나 업데이트하여 데이터 일관성을 보장할 수 있습니다.
질문: MongoDB 데이터에 SQL을 사용할 수 있나요?
A: MongoDB에서 직접 SQL을 실행할 수는 없지만, 객체가 내부에 저장되면 SQL을 실행할 수 있습니다. NCache, 당신이 사용할 수있는 NCache표준 SQL 구문을 사용하여 데이터를 검색하고 필터링하는 SQL 쿼리 기능.
질문 : NCache 보다 나은 Redis .NET MongoDB 애플리케이션용인가요?
A: NCache .NET 환경에서는 100% 네이티브 .NET이기 때문에 선호되는 경우가 많습니다. Redis 리눅스 기반입니다. 즉, NCache Visual Studio 생태계에 완벽하게 통합되고, 복잡한 .NET 개체에 대한 향상된 직렬화를 제공하며, 서버 측 .NET 코드(예: 읽기/쓰기 지연 공급자)를 캐시 노드에서 직접 실행할 수 있도록 합니다. Redis 기본적으로 지원하지 않습니다.
질문: MongoDB BSON 문서를 캐싱하기 전에 변환해야 하나요?
A: 예. NCache MongoDB는 BSON 문서가 아닌 네이티브 .NET 객체를 저장합니다. MongoDB의 BSON 데이터를 캐시에 삽입하기 전에 표준 .NET 클래스(POCO)로 역직렬화해야 합니다. 이렇게 하면 MongoDB의 BSON 데이터를 활용할 수 있습니다. NCache이 소프트웨어의 SQL 쿼리 및 인덱싱 기능은 원시 BSON 바이트가 아닌 객체 속성을 기반으로 작동합니다.
Q : 할 수 있습니다 NCache MongoDB에 자동으로 데이터를 기록하시겠습니까?
A: 네. 이 가이드는 "캐시 기반" 패턴(앱이 수동으로 데이터베이스를 업데이트하는 방식)에 중점을 두었지만, NCache 지원 연속 기입 뒤에 쓰기 공급자를 사용하면 쓰기 작업을 다른 공급자에게 넘길 수 있습니다. 이를 통해 쓰기 작업을 공급자에게 넘길 수 있습니다. NCache그러면 백그라운드에서 MongoDB가 동기식(쓰기 통과) 또는 비동기식(쓰기 지연)으로 업데이트되어 애플리케이션 지연 시간이 더욱 단축됩니다.
Q: 만약 다음과 같은 일이 발생하면 NCache 클러스터가 다운되었나요?
A: 애플리케이션 성능은 저하되지만 기능은 계속 유지됩니다. 표준 "캐시 기반" 패턴에는 캐시가 없는 경우 데이터베이스에서 가져오는 대체 로직이 포함되어 있으므로 애플리케이션은 MongoDB에 직접 액세스하게 됩니다. 성능은 캐시를 사용하지 않는 수준으로 떨어지지만 데이터 손실은 없으며 애플리케이션은 온라인 상태를 유지합니다.






