기본 데이터 구조는 데이터를 저장하고 검색하는 일반적인 방법을 제공합니다. 구현을 통해 독립 실행형 애플리케이션에 동시성을 제공합니다. 이는 애플리케이션 프로세스 내부의 스레드로만 제한된다는 점을 제외하면 훌륭합니다. 그리고 둘 이상의 서버에서 실행되는 확장 가능한 애플리케이션으로 인해 애플리케이션 간에 데이터 구조 상태를 공유해야 할 필요성이 발생합니다.
여기에 분산 데이터 구조가 개입합니다. 기존 데이터 구조의 기능을 제공하는 동시에 분산 데이터 구조를 사용하면 여러 프로세스와 애플리케이션 인스턴스가 데이터 일관성을 손상시키지 않으면서 동시에 데이터를 추가, 가져오기 및 제거할 수 있습니다. 이러한 데이터 구조는 기존 데이터 구조가 해결할 수 없는 문제를 해결합니다. 이것들은 병렬 계산을 가능하게 합니다.
어디서? NCache 딱 맞다?
NCache인 메모리 캐싱 솔루션인 는 분산 데이터 구조가 제공하는 모든 기능을 향상시킵니다. 사용 NCache 분산 캐시를 사용하면 프로세스 외부의 스레드에서 구조화된 데이터에 액세스할 수 있습니다.
데이터를 분산 데이터 구조에 추가하고 서버에 캐시하면 해당 데이터를 저장한 서버에 관계없이 시스템의 일부인 모든 애플리케이션, 프로세스, 인스턴스에서 데이터에 액세스할 수 있는 방법에 감탄할 수 있습니다.
그것을 끝내기 위해 NCache 분할된 복제본 토폴로지의 형태로 고가용성을 제공합니다. 캐시 서버에 보관하는 데이터는 당연히 중요합니다. 서버 오류로 인해 이 데이터가 손실되는 것은 어떤 경우에도 허용되지 않습니다. 이것이 바로 이유입니다 NCache 캐싱 서버에 데이터 복제본을 보관할 수 있으므로 노드 중 하나가 다운되더라도 이러한 시나리오에서 사용할 수 있는 똑같은 데이터의 복제된 세트가 항상 남아 있습니다. 이렇게 하면 .NET 응용 프로그램에서 데이터 손실이 발생하지 않습니다. 무엇보다도 요구 사항에 따라 런타임에 캐싱 서버 노드를 추가할 수 있는 권한이 있습니다.
NCache 데이터 구조 내부에 캡슐화된 데이터의 복제, 분할 및 확장 기능을 제공합니다. 따라서 이러한 데이터 구조를 사용하는 개발자는 .NET 응용 프로그램 내부의 배포 논리에 대해 걱정할 필요가 없습니다.
의 분산 데이터 구조 NCache
NCache .NET 애플리케이션에서 확장성, 동시성 및 정확성을 달성하기 위해 다양한 데이터 구조를 제공합니다. 애플리케이션의 전반적인 성능을 향상시키는 이러한 데이터 구조를 살펴보겠습니다.
분산 목록
NCache 제공 분산 목록 이는 IList 인터페이스의 기본 .NET 구현입니다. NCache 기본 .NET 캐싱 솔루션 자체가 애플리케이션이 .NET 기반인 경우에도 이점이 있습니다. .NET 응용 프로그램에 기본적이고 친절한 모든 것보다 더 나은 것이 무엇입니까?
다음 코드 조각은 배포 목록을 만들고 채우고 채우는 방법을 보여줍니다. NCache.
목록을 만들고 채우는 하나의 애플리케이션:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Specify unique cache key for list string key = "ExpensiveProducts"; DataTypeAttributes dataTypeAttributes = new DataTypeAttributes(); dataTypeAttributes.Expiration = new Expiration(ExpirationType.Sliding, new TimeSpan(0, 2, 0)); // Create list of Product type IDistributedList<Product> list = cache.DataTypeManager.CreateList<Product>(key, dataTypeAttributes); // Get products to add to list Product[] products = FetchProductsFromDB(); foreach (var product in products) { // Add products to list list.Add(product); } |
목록에서 단종된 제품을 가져오고 제거하는 다른 응용 프로그램
1 2 3 4 5 6 |
// Get list of Product type IDistributedList<Product> list = IDistributedList <Customer> list = cache.DataTypeManager.GetList<Product>("ExpensiveProducts"); // Get range of discontinued products to be removed List<Product> itemsToRemove = FetchDiscontinuedProducts(); list.RemoveRange(itemsToRemove); |
일상적인 애플리케이션에 분산 목록을 통합하는 것은 매우 간단합니다. 다음은 배포 목록 구현이 필요한 응용 프로그램을 나타내는 몇 가지 시나리오입니다.
사용 사례: 장바구니
.NET 응용 프로그램이 전자 상거래 플랫폼이라고 가정해 보겠습니다. 이 응용 프로그램에서 고객은 장바구니에 항목을 추가 및 제거할 수 있습니다. 이러한 요청이 적절하게 처리되도록 하려면 고객의 ID가 포함된 각 고객의 데이터와 해당 ID에 대해 추가 또는 제거되는 항목을 저장해야 합니다. 이를 수행하는 가장 좋고 가장 체계적인 방법은 배포 목록을 사용하는 것입니다.
다중 서버 환경에서 분산 목록은 고객의 데이터를 저장하고 모든 서버에서 사용할 수 있도록 합니다. 이 목록에서 고객이 구매한 모든 항목, 관심을 보인 항목 또는 무시하기로 선택한 항목을 추적할 수 있습니다. 이것은 정교한 레코드를 유지함으로써 애플리케이션의 전반적인 가치를 향상시킬 뿐만 아니라 데이터의 가용성을 높입니다.
사용 사례: 리더보드
게임에 관심이 있는 사람들에게 순위표는 온라인 게임이든 전 세계 경기든 중요한 정보 소스 역할을 합니다. 이 사람들은 항상 어떤 팀이 앞서고 누가 뒤쳐지는지 알고 싶어합니다. 이와 같은 정보는 목록 데이터 구조를 사용하여 필요한 데이터를 저장하고 관심 있는 모든 사용자에게 브로드캐스트하는 애플리케이션에 통합될 수 있습니다.
분산 큐
NCache 로 알려진 선입선출 구현을 제공합니다. 분산 큐. 대기열은 FIFO 동작으로 인해 귀중한 정보를 저장하기 위해 런타임에 사용됩니다.
IDistributedQueue는 IDistributedQueue에서 제공하는 이해하기 쉽고 구현하기 쉬운 데이터 구조입니다. NCache. 아래 코드를 보고 대기열 생성, 대기열에서 데이터 추가 및 제거와 같은 대기열의 기본 작업에 익숙해지십시오.
큐를 생성하고 채우는 하나의 애플리케이션
1 2 3 4 5 6 7 8 9 |
string key = "CandidateQueue"; // Create Queue of Candidate type IDistributedQueue<Candidate> queue = cache.DataTypeManager.CreateQueue<Candidate>(key); foreach(var candidate in candidates) { // Add candidates to queue queue.Enqueue(candidate); } |
분산 캐시에서 대기열을 가져오고 첫 번째 항목을 대기열에서 빼는 다른 애플리케이션
1 2 3 4 |
IDistributedQueue<Candidate> queue = cache.DataTypeManager.GetQueue<Candidate>("CandidateQueue"); // Remove first item of queue var firstCandidate = queue.Dequeue(); |
다음은 대기열을 사용할 수 있는 위치와 얻을 수 있는 이점에 대한 대략적인 아이디어를 제공하는 분산 대기열의 사용 사례 중 일부입니다.
사용 사례: 메시지 대기열
한 번에 여러 클라이언트를 접대하는 여러 서버에서 호스팅되는 .NET 응용 프로그램은 응용 프로그램을 사용하는 클라이언트 중 하나로 메시지를 보내야 합니다. 여기서 뭐해? 분산 환경에서는 서버와 클라이언트 간의 연결을 제어하지 않습니다. 즉, 어떤 서버가 어떤 클라이언트를 즐겁게 하는지 알 수 없습니다.
이러한 시나리오에서는 클라이언트에 전달해야 하는 모든 메시지를 추적하기 위해 분산 대기열이 필요합니다. 이 목록은 모든 캐시 서버에 배포되어 애플리케이션에 연결된 모든 클라이언트가 항상 동일한 데이터에 액세스할 수 있도록 합니다. NCache 분산 데이터의 복제를 처리합니다. 따라서 분산 캐시의 분산 큐를 사용하면 데이터 동시성과 고가용성을 얻을 수 있습니다.
사용 사례: 감정 분석
위협적이거나 기밀 트윗을 걸러내기 위해 정보 기관에서 사용하는 애플리케이션은 NCache. 웹 애플리케이션을 실행하는 여러 노드가 있다고 가정해 보겠습니다. 원하는 것은 하나의 트윗이 두 번 이상 처리되지 않는 정밀도로 분산 환경에서 이러한 트윗을 처리하는 것입니다. 이를 달성하는 방법은 해당 응용 프로그램이 분산 대기열을 사용하여 들어오는 모든 트윗을 저장하는 것입니다. 이렇게 하면 트윗이 두 번 처리되지 않으므로 애플리케이션의 전반적인 성능과 정확성이 향상됩니다.
분산 해시 세트
NCache 라고 하는 세트의 매우 빠르고 확장 가능한 구현을 제공합니다. 분산해시세트. HashSet은 값이 고유하고 고유한 정렬되지 않은 데이터 유형입니다.
HashSet을 만들고 채우는 방법을 이해하기 위해 아래 코드를 살펴보겠습니다.
해시 세트를 채우는 첫 번째 애플리케이션
1 2 3 4 5 6 7 8 9 10 |
// Create unique keys for hashSets string mondayUsersKey = "UsersLoggedInOnMonday"; // Create hashSets of object type IDistributedHashSet<string> userSetMonday = cache.DataTypeManager.CreateHashSet<string>(mondayUsersIds); // Add user IDs for Monday userSetMonday.Add("john_smith"); userSetMonday.Add("mike_cohn"); userSetMonday.Add("mike_ross"); |
두 번째 응용 프로그램에서 해시 집합을 가져오고 수정
1 2 3 4 5 6 |
// Getting hashset from cache IDistributedHashSet<string> userSetMonday = cache.DataTypeManager.GetHashSet<string>("UsersLoggedInOnMonday"); // Remove user with given ID from the set userSetMonday.Remove("mike_cohn"); userSetMonday.RemoveRandom(); |
애플리케이션이 고유한 데이터에 대한 작업을 수행해야 하는 경우 분산 HashSet을 사용할 수 있습니다. 다음은 DistributedHashSet의 구현으로 성능이 향상되는 응용 프로그램의 몇 가지 시나리오입니다.
사용 사례: IP 주소 추적
해시셋에는 중복 값이 포함되어 있지 않으므로 다음을 사용할 수 있습니다. NCache웹 사이트의 모든 사용자와 방문자를 추적하기 위한 분산 HashSet의 의 구현. 예를 들어 온라인 서점이 있는 경우 HashSets를 사용하면 어떤 사용자가 어떤 책에 관심이 있고 몇 권의 책을 구입했는지 등을 매우 쉽게 식별할 수 있습니다.
사용 사례: 전자 상거래 판매 분석
필요한 모든 정보를 HashSet 안에 보관할 수 있습니다. HashSet에 필요한 모든 것은 그것에 대해 여러 값을 할당하기 위한 고유한 값입니다. 예를 들어, 온라인 스토어 애플리케이션에서 무엇이든 구매한 모든 사용자를 추적하려고 합니다. 당신은 그들의 ID를 원하고 각 ID에 대해 고객이 구매한 항목, 위시리스트에 넣은 항목, 위시리스트에서 제거된 항목의 목록을 유지하려고 합니다. 이제 세련된 세트에 모든 정보가 있으므로 최대한 쉽게 해당 정보에 대해 여러 작업을 수행할 수 있습니다.
NCache 세부 정보 의 HashSets NCache
분산 사전
분산 사전 에 의해 제공 NCache IDictionary 인터페이스의 기본 .NET 구현인 키-값 쌍입니다. 사전은 특정 키에 대한 값을 보유하며 해당 값을 변경해야 하는 경우 재정의해야 합니다.
다음에서 IDistributedDictionary를 사용할 수 있습니다. NCache 제품의 기록을 유지하기 위해. 다음과 같은 방법으로 사전에서 제품 정보를 생성 및 추가/제거할 수 있습니다.
사전을 만들고 채우는 첫 번째 응용 프로그램
1 2 3 4 5 6 7 8 9 10 11 12 |
string key = "ExpensiveProducts"; // Create dictionary of Product type IDistributedDictionary<string, Product> dictionary = cache.DataTypeManager.CreateDictionary<string, Product>(key); // Adding products to dictionary Product[] products = FetchProducts(); foreach(var product in products) { string productKey = $"Product:{product.ProductID}"; dictionary.Add(productKey, product); } |
두 번째 응용 프로그램 가져오기 및 사전 수정
1 2 3 4 5 6 7 8 9 10 11 |
// Fetch dictionary of Product type from cache IDistributedDictionary<string, Product> dictionary = cache.DataTypeManager.GetDictionary<string, Product>("ExpensiveProducts"); // Create list of keys to remove List<string> keysToRemove = FetchDiscontinuedProducts(); // Get values from dictionary against the given keys ICollection<Product> values = dictionary.Get(keysToRemove); // Remove items from dictionary with given keys int itemsRemoved = dictionary.Remove(keysToRemove); |
분산 사전은 여러 경우에 사용할 수 있으며 각 경우에 매우 편리하고 효율적입니다. 그러한 경우의 예가 아래에 제공됩니다.
사용 사례: 암호화된 값을 캐시에 저장
분산 환경에서 사전을 사용하는 많은 이점 중 하나는 암호화 키를 저장해야 하는 경우입니다. 이러한 키는 해당 분산 시스템의 일부인 모든 서버에서 사용할 수 있어야 합니다. 암호 해독 키와 함께 사전 값으로 캐시 서버 중 하나에 암호화된 데이터를 저장합니다. 이러한 작업을 수행하면 향후 해당 데이터가 필요할 수 있는 모든 서버가 데이터뿐만 아니라 해당 암호 해독 키에 대한 공유 액세스 권한을 가질 수 있습니다.
사용 사례: 로그인 자격 증명 저장
분산 사전은 사용자의 로그인 ID와 암호를 저장하고 액세스하는 가장 효율적인 방법입니다. 사용자가 중요한 데이터에 액세스할 수 있도록 보안 자격 증명을 제공해야 하는 여러 서버에서 실행되는 응용 프로그램이 있다고 가정합니다. 애플리케이션을 제공하는 모든 서버가 이 중요한 정보에 액세스할 수 있도록 하기 위해 이러한 값을 사전 키-값 쌍으로 캐시할 수 있습니다. 이렇게 하면 한 서버가 사전에 새 키-값 쌍을 추가하면 다른 서버가 사전을 통해 필요한 데이터를 쉽게 검색할 수 있습니다.
분산 카운터
NCache 제공 아이카운터 값을 쉽게 증가 및 감소시키는 데 사용되는 데이터 구조입니다. 당신의 삶을 훨씬 더 좋게 만들기 위해, NCache 데이터 일관성을 유지하기 위해 카운터 내부에 배치된 데이터를 잠글 수 있습니다.
.NET 애플리케이션의 경우 다음 코드는 ICounter 인스턴스를 만들고 데이터로 채우는 방법과 해당 값을 늘리거나 줄이는 방법을 이해하는 데 도움이 됩니다.
초기 값으로 카운터를 생성하는 첫 번째 애플리케이션
1 2 3 4 5 6 7 8 |
string key = "SubscriptionCounter"; long initialValue = 15; // Create counter ICounter counter = cache.DataTypeManager.CreateCounter(key, initialValue); // Set the initial value of counter to 100 counter.SetValue(100); |
카운터를 가져오고 수정하는 두 번째 애플리케이션
1 2 3 4 5 6 7 8 |
// Create counter ICounter counter = cache.DataTypeManager.GetCounter("SubscriptionCounter"); // Increment value of counter counter.Increment(); // Decrement value of counter counter.Decrement(); |
수많은 시나리오에서 카운터를 사용할 수 있습니다. 주변을 둘러보기만 하면 발견한 거의 모든 문제는 캐싱 환경에서 분산 카운터를 사용하여 해결할 수 있습니다. 이러한 시나리오 중 일부는 다음과 같습니다.
사용 사례: 페이지 조회수
원하는 것에 따라 웹 페이지가 시간당 또는 하루에 얼마나 많은 조회수를 얻는지 확인하려면 다음에서 분산 카운터를 사용하여 쉽게 구현할 수 있습니다. NCache. 모든 새 보기에서 캐시 서버의 카운터는 그에 따라 증가합니다. 이 값은 모든 캐싱 서버에 있는 모든 값과 함께 일정 시간이 지나면 데이터베이스에서 업데이트됩니다. 이렇게 하면 데이터베이스에 대한 많은 불필요한 이동을 피할 수 있으므로 .NET 응용 프로그램의 전반적인 성능이 향상됩니다.
사용 사례: 트윗 분석
정치인과 유명인의 중요한 트윗을 모두 집계하는 응용 프로그램이 있다고 가정해 보겠습니다. 그것은 또한 그들의 트윗이 받는 좋아요와 싫어요, 댓글 및 항목의 수를 추적합니다. 이제 사람이 A 그의 트윗에 대한 트윗과 좋아요 수는 0분도 채 되지 않아 XNUMX에서 XNUMX만으로 증가합니다. 이것은 일시적이지 않지만 계속 유지해야 하는 데이터 종류입니다. 그러나 지속해야 하는 속도는 데이터가 업데이트되는 속도보다 훨씬 느립니다.
이렇게 갑작스럽고 빈번한 변경 사항을 기록하려면 데이터베이스가 데이터 빈도에 따라 질식하지 않도록 하는 보조 구성 요소가 반드시 필요합니다. 그리고 이것은 당신이 필요로하는 곳입니다 NCache. 인메모리 캐시가 되는 것은 정보를 일시적으로 저장한 다음 일정 시간 후에 데이터베이스에 모두 기록해야 할 때 유용합니다. 여기에서 좋아요 수를 캐싱하기 시작하면 같이 데이터베이스의 값을 직접 수정하는 대신 트윗을 사용하면 불필요한 네트워크 호출을 많이 피할 수 있습니다.
모든 것을 요약
단일 계층 아키텍처가 있으면 분산 데이터 구조가 전혀 필요하지 않습니다. 애플리케이션 내에서 필요한 데이터 구조를 유지하고 구현할 수 있습니다. 그러나 여러 서버로 이동하고 유지할 필요가 없는 임시 데이터 또는 수정 비용이 매우 많이 드는 데이터를 처리하기 시작하면 데이터베이스가 질식하고 성능이 저하됩니다. 애플리케이션에 닥치는 비극을 피하려면 분산 데이터 구조가 필요합니다. 그리고 분산에 대해 이야기할 때 항상 NCache 당신의 마음 뒤에.
NCache 확장성이 매우 뛰어나고 메모리 내 솔루션이라는 사실 때문에 모든 데이터 캐싱 문제에 대한 최상의 솔루션입니다.