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

Вы добавили AppStabric State State Provider в web.config. Все сеансы будут сохраняться в кластере: поэтому у вас есть несколько элементов кэша.

Кроме того, вам нужно будет добавить дополнительную обработку ошибок в вашей системе, как сказал here:

Кэш хосты могут содержать только определенное количество операций кэша в памяти. Возможно, в зависимости от нагрузки системы некоторые клиенты кеша могут не получать уведомления до того, как они усекаются в очередях хоста кэша . Клиенты кэша могут также пропускать уведомления, когда данные теряются из-за сбоя сервера кэша, в то время как остальная часть кластера остается включенной. В этих случаях клиент кэша может обнаружить, что он пропустил некоторые уведомления о кеше, используя уведомление об ошибке . Ваше приложение может добавить обратный вызов для получения отказа уведомлений с помощью метода AddFailureNotificationCallback. Для получения дополнительной информации см Добавить Уведомление о сбое CallBack

EDIT: CacheItemRemovedCallback дает ключ, который удаляется из кэша. Проверьте, всегда ли это одно и то же. Я также рекомендую не ограничивать распределенное кэширование одним элементом: если кто-то еще что-то добавит в кеш, ваша система будет терпеть неудачу.

+0

Я удалил весь раздел '', но, похоже, ничего не изменил. У меня все еще есть несколько элементов. – Kalina

+0

Откуда вы знаете, что есть несколько предметов? вы используете командлет PS-Get-Statistics? – Cybermaxs

+0

Я просто предполагал, что это несколько элементов кеша. У меня нет доступа к PowerShell и я не могу проверить; но что еще может быть проблема? Один элемент кэша истекает несколько раз? – Kalina

 Смежные вопросы

  • Нет связанных вопросов^_^