ASP.NET 웹 응용 프로그램, .NET 웹 서비스 응용 프로그램 및 기타 .NET 서버 응용 프로그램은 속도 저하 없이 극단적인 트랜잭션 로드를 처리해야 합니다. 애플리케이션 계층은 선형적으로 확장되지만 데이터 스토리지 및 데이터베이스 계층은 확장되지 않으므로 병목 현상이 발생합니다. 결과적으로 전체 애플리케이션을 확장할 수 없습니다.
원래는 다음과 같은 간단한 메모리 내 분산 키-값 저장소입니다. Memcached 나중에 Redis 이 확장성 문제를 해결하기 위해 Unix/Linux 플랫폼에 도입되었습니다. 애플리케이션 계층과 마찬가지로 선형 확장성을 제공하고 데이터베이스 병목 현상을 제거했기 때문에 빠르게 인기를 얻었습니다.
NCache 세부 정보 NCache 기술 문서 NCache 클라이언트 API
키 값 저장소의 제한 사항
그러나 이러한 인기에도 불구하고 이러한 솔루션은 본질적으로 매우 단순하고 기본적이며 실제 응용 프로그램이 직면한 많은 문제를 실제로 해결하지 못했습니다. 이러한 솔루션이 매우 약한 일부 영역은 다음과 같습니다.
- 고가용성 부족
- 캐시를 최신 상태로 유지하는 지능적인 방법 부족
- SQL 쿼리 부족
- 서버 측 캐싱 코드 부족(예: Read-through)
예를 들어, 고가용성은 Memcached 타사에서 이를 위한 고가용성 "수정 기능"을 개발하기 시작했습니다. 그러나 기본 아키텍처는 고가용성을 위해 설계되지 않았으므로 이러한 솔루션은 본질적으로 상당히 제한적이었습니다. Redis 동일한 가용성 문제가 있었지만 나중에 데이터 복제 및 장애 조치 지원과 같은 일부 고가용성 기능을 통합하도록 제품을 다시 설계했습니다. 그러나 다음과 같은 모든 키-값 저장소 제품에는 여전히 큰 구멍이 있습니다. Memcached 과 Redis. 여기에서 분산 캐시 솔루션이 구출되었습니다.
.NET 분산 캐시를 2로nd 생성 키 값 저장소
다음과 같은 .NET 분산 캐시 NCache 반면에 위에서 언급한 모든 제한 사항을 해결하기 위해 첫날부터 설계되었습니다. 따라서 본질적으로 NCache 2입니다nd 같은 원래 키 값 저장소로 생성 Memcached 과 Redis. NCache .NET용으로 널리 사용되는 10년 된 분산 캐시입니다.
동적 캐시 클러스터 및 데이터 복제
다음과 같은 분산 캐시 NCache 클러스터의 모든 캐시 서버에서 모든 CPU 및 메모리 리소스를 풀링하는 자가 치유 동적 캐시 클러스터가 있습니다. 동시에, NCache 다양한 제공 캐싱 토폴로지 데이터 배포 및 복제 전략이 다릅니다. 이를 통해 NCache 고가용성을 손상시키지 않고 선형으로 확장합니다. 또한 캐시 서버가 다운되더라도 데이터 손실이 발생하지 않고 캐시 클러스터가 계속 실행되며 캐시를 사용하는 모든 응용 프로그램도 중단 없이 계속됩니다.
캐시를 최신 상태로 유지
분산 캐시와 같은 또 다른 영역 NCache 빛나고 데이터를 최신 상태로 유지하고 항상 데이터베이스와 일관성을 유지합니다. NCache 다음을 포함한 다양한 기능을 통해 이를 수행합니다. 만료, 이벤트 주행 SQL 종속성, 폴링 기반 DbDependency 및 지원 CLR 절차 관계형 데이터베이스의 경우. 만료는 키 값 저장소처럼 작동하지만 SQL 종속성 및 DbDependency 허용 NCache 관련 데이터에 대한 데이터베이스의 변경 사항과 캐시를 동기화합니다. 그리고, CLR 저장 프로시저 해당 데이터가 변경될 때 SQL Server 데이터베이스에서 캐시를 직접 업데이트할 수 있습니다.
즉, 타사 응용 프로그램이 데이터베이스의 데이터를 변경하더라도 NCache 그에 따라 즉시 업데이트됩니다. 이점은 읽기 전용 데이터를 캐싱하는 대신 거의 모든 애플리케이션 데이터를 캐싱하여 더 나은 성능과 확장성을 얻을 수 있다는 것입니다.
SQL로 캐시 검색
따라서 "캐시를 최신 상태로 유지" 기능으로 인해 거의 모든 데이터를 캐시할 수 있는 경우 유일한 메커니즘이 키-값인 경우 데이터를 쉽게 찾을 수 없는 문제에 직면하게 됩니다. 그러나 속성을 기반으로 데이터를 검색할 수 있다면 다음과 같은 분산 캐시가 NCache 검색이 데이터베이스만큼 쉬워집니다. NCache SQL을 제공하고 LINQ 쿼리 이 목적을 위해.
이외에도 SQL 쿼리 개체 속성을 기반으로 할당할 수 있습니다. 그룹, 태그및 명명된 태그 항목을 캐시하고 SQL 쿼리에 포함합니다. 다음은 C#의 SQL 쿼리 예입니다. 예를 들어:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using Alachisoft.NCache.Runtime; using Alachisoft.NCache.Runtime.Exceptions; using Alachisoft.NCache.Web.Caching; public void SearchDataUsingSQL() { Cache cache = NCache.InitializeCache("myparitionreplica"); string query = "SELECT this.Category, " + "MAX(Prod.Product.ProductID) " + "WHERE this.Category = ? " + "GROUP BY this.Category"; Hashtable values = new Hashtable(); values.Add("Category", 4); ICacheReader reader = cache.ExecuteReader(query, values); if (reader.FieldCount > 0) { while (reader.Read()) { //you can get value through the field name... object category = reader.GetOrdinal("Category"); //perform operations } } reader.Close(); return data; } |
서버측 코드
마지막으로 다음과 같은 서버 측 코드가 있습니다. 전체 읽기, 연속 기입, 사용자 지정 종속성및 캐시 로더 및 리프레셔 매우 유용합니다. 이 코드는 사용자가 개발했지만 분산 캐시에 의해 호출되고 캐시 클러스터에서 실행됩니다. 이 코드의 도움으로 애플리케이션을 단순화하고 일반적으로 사용되는 많은 코드를 캐싱 계층으로 이동할 수 있습니다.
예를 들어, NCache 응용 프로그램이 캐시에 없는 일부 데이터를 요청하고 응용 프로그램이 알려줄 때 Read-through 핸들러를 호출합니다. NCache 이 경우 Read-through를 호출합니다. 마찬가지로 Read-through를 만료 및 데이터베이스 동기화와 결합하여 캐시에서 제거하는 대신 캐시된 항목을 자동으로 다시 로드할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using Alachisoft.NCache.Runtime.Caching; using Alachisoft.NCache.Runtime.DatasourceProviders; using Alachisoft.NCache.Runtime.Dependencies; public class SampleReadThruProvider : IReadThruProvider { public void Init(IDictionary parameters, string cacheId) { // Create SQL connection and other initializations at the server side } //Responsible for loading an item from the external data source. public void LoadFromSource(string key, out ProviderCacheItem cacheItem) { //where LoadFromDataSource is the dummy method to load data from data source. object value = LoadFromDataSource(key); //Attach SQL dependency to your object string query = "SELECT ProductID FROM dbo.Products WHERE ProductID = 1001"; cacheItem = new ProviderCacheItem(value); cacheItem.Dependency = new SqlCacheDependency(connectionString, query); //Set expirations cacheItem.SlidingExpiration = new TimeSpan(0, 5, 0); //Indicates whether item should be reloaded on expiration if //ReadThru provider is specified. cacheItem.ResyncItemOnExpiration = true; } public void Dispose() { //... } } |
Write-through는 Read-through와 동일한 방식으로 작동하지만 업데이트용입니다. 애플리케이션이 캐시를 업데이트하면 데이터베이스가 업데이트됩니다. 또한 원하는 경우 캐시가 동기식으로 업데이트되더라도 Write-behind는 데이터베이스를 비동기식으로 업데이트합니다. 마지막으로 캐시가 시작될 때 캐시 로더가 호출되어 원하는 데이터로 미리 로드할 수 있습니다.
결론
당신이 볼 수 있듯이, NCache, 오픈 소스 .NET 분산 캐시는 단순한 것보다 캐시에 훨씬 더 많은 기능을 제공합니다. Redis 키-값 저장소 또는 Memcached. 아래는 분산 캐시 서비스와 키 값 저장소를 자세히 비교한 것입니다. Redis vs NCache 과 Memcached vs NCache.