2

2 대의 서버에 내 웹 사이트 코드가 있고 그 사이에 공유 캐시가 있어야하므로 Microsoft AppFabric을 사용하고 있습니다. 사이트 방문자 당 하나의 항목이 아니라 한 항목의 합계 만 캐시에 하나의 항목 만 남기고 싶습니다.동일한 키를 사용하여 AppFabric 캐시에 여러 캐시 항목이있는 이유는 무엇입니까?

이 작업을 수행하는 데 사용하는 코드는 아래에 있지만 원하는대로 작동하지 않습니다. 문제는 캐시에 많은 항목이 있다는 것인데, 모두 동일한 키를 가지고 있음에도 불구하고 말입니다. 그러나 그것은 다른 일이 될 수 있습니다. 자세한 내용은 코드 주석을 참조하십시오.

Web.config에서 :

<dataCacheClient> 
    <hosts> 
     <host name="MyHost1" cachePort="22233"/> 
     <host name="MyHost2" cachePort="22233"/> 
    </hosts> 
    <securityProperties mode="None" protectionLevel="None" /> 
</dataCacheClient> 
... 
<system.web> 
    <sessionState mode="InProc" customProvider="AppFabricCacheSessionStoreProvider"> 
     <providers> 
      <add 
       name="AppFabricCacheSessionStoreProvider" 
       type="Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider" 
       cacheName="MyCache" 
       sharedId="MySharedApp"/> 
     </providers> 
    </sessionState> 
    ... 
</system.web> 

Global.asax.cs에서 :

private static DataCacheFactory _cacheFactory = new DataCacheFactory(); 
private static DataCache _cache; 

private void RegisterCacheEntry(){ 
    try 
    { 
     // Set up cache 
     _cache = _cacheFactory.GetCache("MyCache"); 

     // Prevent duplicate key addition 
     if (_cache.GetCacheItem(CacheItemKey) != null || _cache.Get(CacheItemKey) != null) 
      return; 

     // Add item to cache 
     _cache.Add(CacheItemKey, CacheItem, TimeSpan.FromMinutes(10)); 

     // When the cache item is removed, the callback: 
     // 1) sends me an email 
     // 2) adds the same item with the same key to the cache again. 
     // So I SHOULD be getting one email every 10 minutes. 
     // However, it starts with one, but the number of emails that I get increases every 10 minutes. 
     // i.e., I get one email at time t=0, two emails at t=1, three at t=2, then four, etc. 
     _cache.AddItemLevelCallback(CacheItemKey, DataCacheOperations.RemoveItem, CacheItemRemovedCallback); 
    } 
    catch (Exception e){} 
} 

당신은 왜, 내가 캐시 제한 시간을 사용하여 Windows 서비스를 시뮬레이션하기 위해 노력하고있어 내가 뭘하고 더 많은 정보를 원한다면 here. 하지만이 두 서버에서 작동하도록 노력하고있어.

답변

1

web.config에 AppFabric 세션 상태 공급자를 추가했습니다. 모든 세션이 클러스터에 유지됩니다. 이것이 여러 캐시 항목을 갖는 이유입니다. here을 말했듯이

또한, 당신은 시스템에 여분의 오류 관리를 추가해야합니다

캐시 호스트는 메모리에 캐시 작업의 일정 금액을 보유 할 수 있습니다. 시스템로드에 따라 일부 캐시 클라이언트가 캐시 호스트 큐 에서 잘린 전에 알림을받지 못할 수도 있습니다. 캐쉬 클라이언트는 캐시 서버 실패로 인해 데이터가 손실 될 때 클러스터가 실행 중일 때 알림을 누락 할 수도 있습니다. 이러한 경우 캐시 클라이언트는 알림을 사용하여 일부 캐시 알림을 놓친 경우 을 발견 할 수 있습니다. 응용 프로그램에서 AddFailureNotificationCallback 메서드를 사용하여 알림 알림을 수신 할 콜백을 추가 할 수 있습니다. 자세한 내용은 장애 통지 콜백을

편집 추가를 참조하십시오 : CacheItemRemovedCallback는 캐시에서 제거 된 키를 제공합니다. 항상 동일한 지 확인하십시오. 캐시 된 항목을 단일 항목으로 제한하지 않는 것이 좋습니다. 누군가 다른 사람이 캐시에 항목을 추가하면 시스템이 실패합니다.

+0

전체' 섹션을 삭제했지만 아무 것도 변경하지 않은 것 같습니다. 나는 아직도 여러 항목을 가지고있다. – Kalina

+0

여러 항목이 있다는 것을 어떻게 아나요? PS cmdlet Get-Statistics를 사용하고 있습니까? – Cybermaxs

+0

난 그냥 여러 캐시 항목이라고 가정했다. PowerShell에 액세스 할 수 없어 확인할 수 없습니다. 그러나 그 밖의 무엇이 문제 일 수 있 었는가? 하나의 캐시 항목이 여러 번 만료됩니까? – Kalina