2

我在两台服务器上有我的网站代码,我想要它们之间的共享缓存,所以我使用的是 Microsoft 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 服务。但我试图让它在两台服务器上工作。

4

1 回答 1

1

您在 web.config 中添加了 AppFabric 会话状态提供程序。所有会话都将保留在集群中:这就是您有多个缓存项的原因。

此外,您需要在系统中添加额外的错误管理,如此所述:

缓存主机只能在内存中保存一定数量的缓存操作。根据系统负载,某些缓存客户端在缓存主机队列中被截断之前可能不会收到通知。当由于缓存服务器故障而导致数据丢失而集群的其余部分仍在运行时,缓存客户端也可能会错过通知。在这些情况下,您的缓存客户端可以通过使用失败通知来发现它错过了一些缓存通知。您的应用程序可以使用 AddFailureNotificationCallback 方法添加回调以接收失败通知。有关更多信息,请参阅添加失败通知回调

编辑: CacheItemRemovedCallback提供从缓存中删除的密钥。检查它是否始终相同。我还建议不要将分布式缓存限制为单个项目:如果其他人在缓存中添加某些内容,您的系统将失败。

于 2013-04-29T11:07:46.800 回答