트래픽이 많은 애플리케이션의 급격한 증가와 함께 이 시대에 필요한 것은 확장성입니다. 이러한 이유로 분산 캐싱 시스템은 오늘날 응용 프로그램의 핵심으로 자리 잡았습니다. NCache – .NET 애플리케이션을 위한 최고의 분산 캐시도 예외는 아닙니다.
일반적으로 캐싱 시스템을 고려할 때 캐시가 재부팅되면 캐시에 저장된 모든 데이터를 더 이상 사용할 수 없다는 것은 자연스럽게 휘발성 및 비영구적 시스템으로 간주됩니다.
매일 수백, 수천 건의 사용자 트랜잭션이 있는 온라인 전자 상거래 상점이 모든 데이터를 분산 캐시에 저장하여 사용자가 매우 빠른 속도로 해당 데이터에 액세스해야 한다고 가정합니다. 전자 상거래 상점은 모든 데이터를 비휘발성 분산 캐시에 저장하고 예상치 못한 상황으로 인해 캐시가 충돌하거나 재부팅되는 경우에도 데이터를 유지하려고 합니다.
사용하는 솔루션이 있습니다. NCache의 서버 측 배포를 통해 캐시를 수정하고 영구적으로 만들 수 있습니다. GitHub에서 다음과 같이 솔루션을 찾을 수 있습니다. NCache 영구 캐시. 이 솔루션은 Read-Thru 및 Write-Thru 공급자를 사용하여 캐시의 동작을 영구 캐시로 변경합니다. 영구 캐시는 결코 일반 데이터베이스를 대체하는 것이 아니라 더 빠르고 쉽게 액세스할 수 있도록 하는 확장일 뿐입니다. NET의 두 가지 주요 데이터베이스 시스템인 SQL 및 Cosmos DB로 추가 코드 없이 구현할 수 있습니다. 이에 대해 좀 더 자세히 살펴보자.
사용 NCache영구 캐시에 대한 의 기능
NCache 영구 데이터 저장소를 사용하면 더 오랜 기간 동안 데이터를 저장할 수 있습니다. 일반적으로 데이터는 사전 정의된 만료 시간으로 또는 애플리케이션이 삭제 명령을 보낼 때까지 영구 저장소에 저장됩니다. 지속성 저장소는 분산 캐시 외부에 있으며 캐시에 저장된 모든 데이터는 휘발성 특성으로 인해 캐시가 지워질 때 사용할 수 있도록 영구 저장소에 자동으로 저장됩니다. 응용 프로그램의 모든 읽기 요청에서 캐시에 요청된 데이터가 없으면 캐시는 영구 저장소에서 항목을 자동으로 검색하고 캐시 데이터는 손실되지 않습니다. 이것은 그림 1에 나와 있습니다.
NCache 영구 저장소는 캐시에 저장된 데이터를 사용할 수 없을 때 원활하고 원활한 트랜잭션을 보장하기 위해 다음과 같은 서버 측 배포 기능을 제공합니다.
- 영구 시작 로더: 이 공급자는 캐시가 시작될 때마다 영구 저장소에서 캐시로 데이터를 로드합니다. 캐시에서 모든 쓰기 작업이 수행될 때마다 영구 저장소가 업데이트되고 캐시가 다시 시작될 때마다 유지된 모든 데이터가 캐시에 로드됩니다. 따라서 전체 캐시 클러스터가 어떤 이유로든 다운되었다가 다시 시작된 후에도 캐시된 데이터가 손실되지 않습니다.
- 지속적 쓰기 공급자: 이 공급자는 영구 캐시에 무언가를 쓸 때 자동으로 호출됩니다. 캐시가 다시 시작될 때 계속 사용할 수 있도록 영구 저장소에 기록된 내용을 복제합니다. 이 공급자를 구성하는 데는 Write-Thru 및 Write-Behind의 2가지 옵션이 있습니다. 이를 통해 사용자는 백그라운드에서 복제를 수행하거나 쓰기 작업 전에 복제할 수 있습니다.
와 쓰기 시간u, 모든 쓰기 작업에서 데이터는 영구 저장소에 동시에 저장되고 제어는 애플리케이션에 다시 제공됩니다.
와 뒤에 쓰기, NCache 작업을 대기열에 넣고 백그라운드에서 수행하여 데이터베이스 작업이 수행되기 전에 사용자에게 흐름을 반환합니다. - 지속적 읽기 공급자: 이 공급자는 사용자가 캐시에서 사용할 수 없는 데이터를 요구하는 경우에 호출됩니다. Read Through 공급자를 사용하는 캐시 클러스터는 영구 저장소에서 이 데이터를 가져와 캐시에 보존합니다.
지속성 WriteThru 공급자의 빠른 예
영구 캐시를 사용하는 방법에 대한 간단한 예를 살펴보겠습니다. NCache. 이 예에서는 다음을 사용하여 캐시에 항목을 추가합니다. WriteThru 공급자. 사용자가 캐시에 항목을 추가하면 캐시 서버와 함께 배포된 연속 기입 공급자가 호출되고 항목은 동시에 영구 데이터 저장소에 저장됩니다. 이제 캐시가 종료되거나 Write-Thru를 사용하지 않고 캐시에서 항목이 제거되는 경우 항목이 캐시에서는 제거되지만 영구 저장소에서는 제거되지 않습니다. 데이터는 영구 저장소 내부에 있으므로 손실되지 않습니다. 해당 항목이 필요할 때 영구 저장소에서 캐시로 가져옵니다.
다음은 Write-Thru 공급자의 인터페이스를 보여주는 기본 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class PersistenceWriteThruProvider : ProviderBase, IWriteThruProvider { public OperationResult WriteToDataSource(WriteOperation operation) { OperationResult operationResults = new OperationResult(operation, OperationResult.Status.Success); switch (operation.OperationType) { case WriteOperationType.Add: var items = new Dictionary<string, ProviderItemBase>(); items.Add(operation.Key, operation.ProviderItem); _persistenceProvider.Add(items); break; // Update and remove cases are similar and need to be handled } return operationResults; } } |
다음은 연속 기입이 활성화된 캐시에 항목을 삽입하여 배포된 연속 기입 구현을 활용하는 방법입니다.
1 2 3 4 5 6 |
// Enable write through for the cacheItem created var writeThruOptions = new WriteThruOptions(); writeThruOptions.Mode = WriteMode.WriteThru; // Add the item in the cache with WriteThru enabled CacheItemVersion itemVersion = cache.Insert(key, cacheItem, writeThruOptions); |
지속성 ReadThru 공급자
응용 프로그램이 캐시에서 일부 데이터를 원한다고 가정합니다. 이 데이터는 이전에 캐시에 저장되었지만 어떤 이유로 인해 더 이상 사용할 수 없습니다. 일반적으로 사용자가 이러한 데이터에 액세스하려고 하면 캐시에 필요한 데이터가 포함되어 있지 않고 데이터베이스에서 데이터를 가져오기 위해 쿼리를 포함하는 추가 코드를 작성해야 하므로 캐시는 null 값을 반환합니다. 이로 인해 애플리케이션 로직이 너무 복잡해집니다. 캐시는 먼저 필요한 항목을 검색하고 사용할 수 없는 경우 데이터베이스를 확인한 후 데이터를 로드합니다.
우리가 사용할 때 NCache 지속성 데이터 저장소, 캐시에서 제거된 데이터는 여전히 지속성 데이터 저장소에 저장되고 캐시는 ReadThru공급자 구현 및 데이터는 캐시에서 호출되어 사용자에게 반환됩니다. 따라서 이제 추가 코드 없이 캐시에서 삭제된 경우에도 원하는 데이터를 얻을 수 있습니다.
다음은 Read-Thru 공급자의 인터페이스를 보여주는 기본 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class PersistenceReadThruProvider : ProviderBase, IReadThruProvider { public ProviderCacheItem LoadFromSource(string key) { return (ProviderCacheItem)(_persistenceProvider.Get(new string[] { key })[key]); } public ProviderDataTypeItem LoadDataTypeFromSource(string key, DistributedDataType dataType) { ... } public IDictionary<string, ProviderCacheItem> LoadFromSource(ICollection keys) { ... } } |
read-through가 활성화된 캐시에서 데이터를 가져올 수 있으므로 캐시에 데이터가 없는 경우 read-through 제공자의 구현에 따라 데이터 소스에서 데이터를 가져옵니다.
1 2 3 4 5 6 |
// Specify the readThruOptions for read through operations var readThruOptions = new ReadThruOptions(); readThruOptions.Mode = ReadMode.ReadThru; // Retrieve the data of the corresponding item with reads thru enabled Product data = cache.Get(key, readThruOptions); |
NCache 세부 정보 Read-Through 캐싱 문서
지속성 시작 로더
앞에서 설명한 것처럼 캐시는 휘발성이며 캐시가 꺼지면 캐시의 모든 데이터가 완전히 지워집니다. 다시 시작하면 캐시가 비어 있으므로 다시 채워야 합니다. Read-Thru 공급자를 사용하여 필요할 때 각 항목을 로드하면 데이터 및 작업을 가져오는 프로세스가 느려집니다. 캐시 시작 시 캐시의 모든 데이터를 로드할 수 있다면 어떨까요? 이랑 캐시 로더 인터페이스 제공 NCache, 영구 저장소의 모든 데이터는 시작 시 캐시에 복제되므로 애플리케이션에서 사용할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class PersistenceStartupLoader : ProviderBase, ICacheLoader { public LoaderResult LoadNext(object userContext) { if (persistentItems == null) persistentItems = _persistenceProvider.GetAll(); LoaderResult result = new LoaderResult(); foreach (var item in persistentItems) { result.Data.Add(new KeyValuePair<string, ProviderItemBase>(item.Key, item.Value)); } return result; } } |
영구 데이터 저장소에서 데이터 삭제
내가 만든 솔루션에서 영구 저장소는 캐시에 연결되므로 캐시 내에서 변경한 사항은 영구 저장소 내에서도 이루어집니다. 예를 들어 데이터 항목은 캐시와 영구 저장소에 저장됩니다. 사용자가 캐시에서 이를 삭제하면 연속 저장 제공자의 도움으로 영구 저장소에서도 삭제됩니다. 이렇게 하면 기본 캐시가 영구 데이터 저장소와 동기화된 상태를 유지합니다.
그러나 이것은 완전히 유연하므로 애플리케이션이 삭제 명령을 보내더라도 이를 변경할 수 있으며 영구 저장소에 항목을 저장할 수 있습니다.
NCache?
NCache 100% .NET / .NET Core 응용 프로그램. 캐시 지속성을 지원하는 서버 측 기능을 제공하며 필요에 따라 캐시 지속성을 사용하도록 만들 수 있는 많은 구성이 있습니다. 데이터는 캐시에서 우리가 선택한 모든 데이터베이스로 지속할 수 있습니다. NCache 애플리케이션 데이터를 캐시하고 데이터 스토리지 및 데이터베이스와 관련된 성능 병목 현상을 제거합니다. 필요할 때 데이터를 사용할 수 있도록 더 오랜 기간 동안 데이터를 캐시에 저장할 수 있습니다. NCache 지속성 데이터 저장소를 사용하면 캐시가 시작될 때마다 데이터베이스에서 캐시로 데이터를 이동할 필요가 없습니다. 이것은 추가 코드를 작성할 필요 없이 데이터의 고가용성을 보장합니다!
하기에 머리 NCache 구현 및 사용 방법에 대해 자세히 알아보기 위한 문서 NCache 분산 캐시와 함께 영구 데이터 저장소.