NCache 서버 측의 캐싱 항목 세트에 대해 기능(또는 "프로세서")을 실행할 수 있도록 하는 항목 프로세서를 도입합니다.
일반적으로 캐시 항목을 업데이트하려면 캐시 서버와 두 번 "대화"해야 합니다. 한 번은 캐시에서 항목을 검색하고 다른 한 번은 항목을 처리한 후 다시 업데이트합니다. 그러나 엔트리 프로세서를 사용하면 서버에서 직접 캐시 항목을 업데이트하여 이러한 네트워크 이동과 불필요한 리소스 소비를 절약할 수 있습니다.
NCache 사용 중인 캐싱 토폴로지에 관계없이 엔트리 프로세서를 실행합니다. 분할된 토폴로지의 경우 엔트리 프로세서는 처리할 엔트리가 포함된 노드에서 실행됩니다.
엔트리 프로세서를 호출하면 우리가 정의한 로직에 따라 단일 항목 또는 항목 집합을 처리합니다. NCache 클러스터 전체에서 프로세서를 실행합니다. 엔트리 프로세서 내부에서 다음을 수행할 수 있습니다.
- 처리하지 않고 캐시 항목을 반환합니다.
- 항목을 수정하고 캐시에 저장하거나,
- 항목을 제거합니다.
프로세서를 실행하기 전에 항목이 잠긴 경우 잠금을 무시하고 잠긴 항목에 액세스하여 처리할 수 있습니다.
NCache 세부 정보 NCache 엔트리 프로세서 엔트리 프로세서 구현
엔트리 프로세서와 다른 캐시 작업 비교
엔트리 프로세서는 캐시 항목을 가져오고 업데이트하는 네트워크 트립을 저장하여 서버에서 직접 캐시 또는 항목을 업데이트하거나 제거하는 데 도움이 됩니다.
작동 중인 엔트리 프로세서를 보기 위해 일부 고객을 캐시에 로드하는 콘솔 앱을 작성해 보겠습니다. 고객의 이름, 보상 포인트, 마지막 구매 날짜를 저장합시다. 그리고 고객의 구매 동기를 부여하기 위해 지난 XNUMX일 동안 구매한 모든 고객의 리워드 포인트를 두 배로 합시다. 그런 다음 엔트리 프로세서와 대량 캐시 작업을 사용하여 동일한 시나리오를 다시 만들어 이러한 접근 방식 간의 실행 시간 차이를 확인합니다.
샘플 애플리케이션을 시작하기 전에 NCache Enterprise 에디션 인스턴스가 실행 중입니다. 엔트리 프로세서는 Enterprise 에디션에서만 사용할 수 있습니다.
1. 대량 캐시 작업 사용
NCache 단일 호출로 동시에 캐시 항목을 검색하고 업데이트하는 대량 작업을 지원합니다. 대량 작업을 사용하면 캐시 서버로의 네트워크 이동 횟수가 줄어들기 때문에 성능이 향상됩니다.
여러 캐시 항목을 대량으로 검색하려면 다음이 필요합니다. GetCacheItemBulk()
키 목록과 함께. 사전에서 찾은 항목을 반환합니다. 그리고 항목을 대량으로 업데이트하려면 InsertBulk()
업데이트할 항목 사전이 있는 메서드입니다.
비교를 시작하려면 NCache GetCacheItemBulk()
와 InsertBulk()
단일 요청에서 캐시 항목을 검색하고 업데이트하는 메서드입니다.
. Program.cs
콘솔 앱의 파일, 다음과 같이 작성하겠습니다.
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 32 33 34 35 |
using Alachisoft.NCache.Client; using RewardPoints; using RewardPoints.Shared; const string CacheName = "demoCache"; var customers = new List { new Customer(1, "Alice", DateTime.Today.AddDays(-1), 100), new Customer(2, "Bob", DateTime.Today.AddDays(-6), 5), new Customer(3, "Charlie", DateTime.Today.AddMonths(-1), 1), new Customer(4, "Daniel", DateTime.Today.AddDays(-3), 10), new Customer(5, "Earl", DateTime.Today, 20) }; var keys = customers.Select(c => c.ToCacheKey()); // Load customers into the cache ICache cache = CacheManager.GetCache(CacheName); PopulateCache(cache, customers); // Double customer points using NCache Bulk methods var retrievedItems = cache.GetCacheItemBulk(keys); var itemsToUpdate = new Dictionary<string, CacheItem>(); foreach (var item in retrievedItems) { var customer = item.Value.GetValue(); // Check if the customer has purchased anything in the last 5 days if (customer.LastPurchase >= DateTime.Today.AddDays(-5)) { var updated = customer with { Points = customer.Points * 2 }; itemsToUpdate.Add(updated.ToCacheKey(), updated.ToCacheItem()); } } cache.InsertBulk(itemsToUpdate); |
먼저 일부 고객을 캐시에 로드했습니다. 우리는 생성된 기본 "demoCache" 캐시를 사용했습니다. NCache 설치. 다음으로 우리는 다음을 사용하여 고객을 검색했습니다. GetCacheItemBulk()
방법. 그런 다음 모든 고객의 마지막 구매 날짜를 확인한 후 포인트를 두 배로 늘리고 업데이트된 모든 고객을 다시 캐시에 넣습니다.
고객을 개별적으로 업데이트하는 대신 사전을 사용하여 보상을 얻은 고객을 누적했습니다. 그런 다음 우리는 InsertBulk()
사전을 이용한 방법.
와 더불어 GetCacheItemBulk()
와 InsertBulk()
방법을 사용하여 네트워크 이동을 단 두 번으로 줄였습니다. 모든 고객을 검색하기 위한 네트워크 호출과 고객을 다시 캐시에 저장하기 위한 네트워크 호출.
이들 및 기타 대량 방법에 대한 자세한 내용은 다음을 확인하십시오. CRUD 작업: 개요.
2. 엔트리 프로세서 사용
대량 방법을 사용했으므로 이제 Entry Processor를 사용하여 고객의 보상 포인트를 두 배로 늘리겠습니다. 이 같은,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using Alachisoft.NCache.Client; using RewardPoints; using RewardPoints.Shared; const string CacheName = "demoCache"; var customers = new List { new Customer(1, "Alice", DateTime.Today.AddDays(-1), 100), new Customer(2, "Bob", DateTime.Today.AddDays(-6), 5), new Customer(3, "Charlie", DateTime.Today.AddMonths(-1), 1), new Customer(4, "Daniel", DateTime.Today.AddDays(-3), 10), new Customer(5, "Earl", DateTime.Today, 20) }; var keys = customers.Select(c => c.ToCacheKey()); // Load customers ICache cache = CacheManager.GetCache(CacheName); PopulateCache(cache, customers); // Double customer points using Entry Processor var processor = new DoublePointsProcessor(); cache.ExecutionService.Invoke(keys, processor); |
캐시 항목을 업데이트하기 위해 어떤 방법도 사용할 필요가 없었습니다. 우리는 프로세서를 생성하고 일련의 키를 전달하고 Invoke()
방법. 엔트리 프로세서 내부의 고객을 업데이트해야 합니다.
NCache 세부 정보 NCache 엔트리 프로세서 엔트리 프로세서 구현
엔트리 프로세서 구성
엔트리 프로세서를 작성하려면 다음에서 상속하는 클래스를 만들어야 합니다. IEntryProcessor
그리고 사용 [Serializable]
기인하다. 이것은 우리의 엔트리 프로세서입니다.
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 |
using Alachisoft.NCache.Runtime.Processor; namespace RewardPoints.Shared; [Serializable] public class DoublePointsProcessor : IEntryProcessor { public bool IgnoreLock() => true; public object Process(IMutableEntry entry, params object[] arguments) { // Check if the cache entry is a customer and // if the customer has purchased something in the last 5 days if (entry.Key.StartsWith(nameof(Customer)) && entry.Value is Customer { LastPurchase: var lastPurchase } customer && lastPurchase >= DateTime.Today.AddDays(-5)) { // Update the customer's points var updatedCustomer = customer with { Points = customer.Points * 2 }; entry.Value = updatedCustomer; return updatedCustomer; } return false; } } |
프로세서의 캐시 항목을 업데이트하려면 캐시 항목을 덮어써야 합니다. Value
재산 entry
업데이트된 캐시 항목이 있는 매개변수입니다.
클라이언트 애플리케이션이 항목을 잠그는 경우 다음을 사용하여 항목 프로세서를 실행할 수 있습니다. IgnoreLock()
방법. 잠금을 무시하고 이를 처리하기 위해 항목에 액세스합니다.
새 프로세서를 사용하기 전에 프로세서 및 해당 종속성과 함께 DLL을 배포해야 합니다. NCache. Powershell을 사용할 수 있습니다. Install-NCacheModule
cmdlet 또는 NCache 웹 관리자. Web Manager를 사용하여 엔트리 프로세서를 배포하는 지침은 다음을 확인하십시오. 공급자 배포.
예를 들어 "demoCache" 인스턴스를 중지하고 Powershell을 실행해 보겠습니다. Install-NCacheModule
cmdlet,
NCache 세부 정보 NCache 엔트리 프로세서 엔트리 프로세서 구현
엔트리 프로세서는 어떻게 처리합니까? 과 작업 실패?
엔트리 프로세서가 실행되면 유형의 결과 모음을 반환합니다. IEntryProcessorResult
. 각 결과에는 IsSuccessful
깃발과 Value
수정한 결과입니다. 샘플 엔트리 프로세서의 경우 Value
속성은 다음 중 하나를 포함합니다. false
, 고객에게 최근 구매가 없거나 업데이트된 고객이 없는 경우.
엔트리 프로세서가 실행되는 동안 예외가 발생하면 IsSuccessful
플래그는 false
그리고 Exception
속성은 발생한 예외로 채워집니다.
엔트리 프로세서를 안전 장치로 만들려면 모든 잠재적 예외를 처리해야 합니다. 예를 들어, 우리는 OperationFailedException
연결 실패가 있는 경우. 또한, 우리는
EntryProcessorException
, 이 경우 엔트리 프로세서는 캐시 항목을 수정하지 않았습니다.
이것이 입력 결과와 가능한 예외 메시지를 표시하는 방법입니다.
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 32 33 34 35 36 37 38 39 40 |
using Alachisoft.NCache.Client; using RewardPoints; using RewardPoints.Shared; const string CacheName = "demoCache"; var customers = new List { new Customer(1, "Alice", DateTime.Today.AddDays(-1), 100), new Customer(2, "Bob", DateTime.Today.AddDays(-6), 5), new Customer(3, "Charlie", DateTime.Today.AddMonths(-1), 1), new Customer(4, "Daniel", DateTime.Today.AddDays(-3), 10), new Customer(5, "Earl", DateTime.Today, 20) }; var keys = customers.Select(c => c.ToCacheKey()); // Load customers ICache cache = CacheManager.GetCache(CacheName); PopulateCache(cache, customers); try { // Double customer points using Entry Processor var processor = new DoublePointsProcessor(); var processedEntries = cache.ExecutionService.Invoke(keys, processor); foreach (IEntryProcessorResult entryResult in processedEntries) { DisplayEntryResult(entryResult); } } catch (EntryProcessorException e) { Console.WriteLine($"Error running the processor: {e.Message}"); } catch (OperationFailedException e) { Console.WriteLine($"Error connecting to the cache server: {e.Message}"); } |
이제 세 가지 대안을 나란히 실행해 보겠습니다. 내 컴퓨터에서 실행했습니다. NCache 로컬에 설치하고 내가 생성한 20명의 무작위 고객을 사용하여 가짜의. 결과는 다음과 같습니다.
결론
확실히 엔트리 프로세서를 사용하는 대안이 가장 빠릅니다. 그것은 12밀리초에 끝났고, 대량 방법을 사용한 것은 72밀리초에 끝났습니다. 엔트리 프로세서를 사용하면 서버에서 직접 고객의 포인트를 두 배로 늘려 과도한 네트워크 트립을 모두 저장했기 때문에 성능이 향상되었습니다.
이것이 엔트리 프로세서의 정의와 작동 방식입니다. 이를 테스트하기 위한 벤치마크를 작성하지 않았지만 NCache 이 비교는 엔트리 프로세서를 사용하는 방법에 대한 아이디어를 제공합니다. 그들과 함께 우리는 왕복 여행을 절약합니다. NCache 캐시 항목을 직접 처리하여 서버 NCache 섬기는 사람. 다음에 일부 캐시 항목을 업데이트해야 할 때 엔트리 프로세서를 사용해 보십시오.
엔트리 프로세서의 작동 방식에 대한 자세한 내용은 다음을 확인하십시오. 캐시에서 엔트리 프로세서의 작업.
코드를 따르기 위해 이 게시물에서 작성했습니다. NCache 데모 저장소 GitHub에.