Performance AppFabric缓存-正确使用DataCacheFactory和DataCache

Performance AppFabric缓存-正确使用DataCacheFactory和DataCache,performance,caching,appfabric,Performance,Caching,Appfabric,我正在寻找最有效的方法来安排使用datacache和datacache工厂进行AppFabric缓存调用,每页面加载400到700次缓存(几乎没有任何put)。似乎使用一个静态DataCacheFactory(或者在循环设置中使用一对静态DataCacheFactory)是一种可行的方法 我是为每个DataCache对象请求调用GetCache(“cacheName”),还是在初始化DataCache工厂时创建一个静态,并将其用于所有调用 我是否必须处理异常、检查失败代码并重试 当多个线程尝试使

我正在寻找最有效的方法来安排使用datacache和datacache工厂进行AppFabric缓存调用,每页面加载400到700次缓存(几乎没有任何put)。似乎使用一个静态DataCacheFactory(或者在循环设置中使用一对静态DataCacheFactory)是一种可行的方法

我是为每个DataCache对象请求调用GetCache(“cacheName”),还是在初始化DataCache工厂时创建一个静态,并将其用于所有调用

我是否必须处理异常、检查失败代码并重试

当多个线程尝试使用缓存存储并需要相同的项(按密钥)时,是否必须考虑争用?< /P> 是否有某种文档正确地探讨了此功能的设计和使用?


我从论坛收集到的一些信息:

创建工厂需要连接到群集,可能需要一些时间。但是,一旦您拥有了要使用的工厂对象和缓存,您就可以简单地重用这些对象来执行放入和进入缓存的操作,您应该会看到更快的性能

创建单个DataCacheFactory(singleton)比创建多个DataCacheFactory的性能更高。您不应该为每个调用创建DataCacheFactory,它会影响性能

“请尝试在单例中封装循环算法(具有3/4/5个工厂实例),并比较负载测试结果。”

“您可以增加客户端数量以增加缓存吞吐量。但有时,如果您希望拥有较小的客户端集并提高吞吐量,一个技巧是使用多个DataCacheFactory实例。DataCacheFactory实例创建到服务器的连接(例如,如果有3台服务器,它将创建3个连接)并将来自DataCache的所有请求多路传输到这些连接。因此,如果put/get卷非常大,这些TCP连接可能会受到限制。因此,一种方法是创建多个DataCacheFactory实例,然后对其使用操作。”


这里是目前正在使用的。。。调用属性,如果返回值不为null,则执行操作

private static DataCache Cache
{
    get
    {
        if (_cacheFactory == null)
        {
            lock (Sync)
            {
                if (_cacheFactory == null)
                {
                    try
                    {
                        _cacheFactory = new DataCacheFactory();
                    }
                    catch (DataCacheException ex)
                    {
                        if (_logger != null)
                        {
                            _logger.LogError(ex.Message, ex);
                        }
                    }
                }
            }
        }

        DataCache cache = null;

        if (_cacheFactory != null)
        {
            cache = _cacheFactory.GetCache(_cacheName);
        }

        return cache;
    }
}

在Microsoft AppFabric论坛上查看此问题:

我是否需要调用GetCache(“cacheName”)以获取 每个DataCache对象请求,或执行 我一次做一个静电 数据缓存工厂已初始化,并且 所有电话都用这个吗

我想答案应该是;两种方法都试一下,看看是否有区别,但在我看来,对于要获取的每个调用,一个静态数据缓存似乎比相应地调用
GetCache
更有意义

那篇“推动客户机性能”的文章指出,有一个最佳点,DataCacheFactory实例的数量可以使您获得最大性能,超过这个最佳点,内存开销就开始对您不利了——遗憾的是,他们没有给出任何关于这一点的指导原则(甚至是经验法则)

我还没有看到任何关于性能最大化的文档——我认为AppFabric对于这些指导原则来说还是太新了,还不足以彻底改变。我确实查看了AppFabric的内容,但它似乎更关注AppFabric的工作流(都柏林)方面,而不是缓存(Velocity)部分


不过我想说的一件事是:您是否有可能缓存“chunkier”对象,以便减少对
Get
的调用?是否可以缓存集合而不是单个对象,然后在客户端上解压缩集合?在我看来,每页加载700次缓存似乎是一个巨大的数字

以下是论坛帖子的答案:

嗨。很抱歉延迟回复, 但我想说的是,这些都很棒 问题和答案可能会有用 对其他人来说

不应该有更多的需要 每个线程有多个DataCacheFactory 除非您需要不同的 配置。例如,如果你 以编程方式配置 带有 DataCacheFactoryConfiguration类, 那么您可能想创建一个 已启用本地缓存,并且另一个 但事实并非如此。在这种情况下,你会 使用不同的DataCacheFactory对象 取决于您选择的配置 对于您的场景,需要。但其他 相比于配置上的差异,您 不应通过以下方式获得性能提升: 创建多个DataCacheFactory

在同一主题上,有一个 MaxConnectionsToServer设置(或 编程的 DataCacheFactoryConfiguration或中的 应用程序配置文件如下所示: dataCacheClient的属性 元素)。这决定了数量 每个DataCacheFactory的chennels数 已打开到缓存群集。如果 您有高吞吐量需求 以及可用的CPU/网络 带宽,将此设置增加到 3或更高可以增加吞吐量。 我们不建议增加这个 没有理由或达到一个 对你的需求来说太高了。你应该 更改该值,然后测试您的 观察结果的情景。我们 希望有更多的官方指导 这是将来的事

一旦有了DataCacheFactory,您就可以 不需要调用GetCache() 多次得到多次 数据缓存对象。每一个电话 上相同缓存的GetCache() 同一工厂退货相同 数据缓存对象。还有,一旦你 DataCache对象,您不需要 继续调用DataCacheFactory 为了它。只需存储数据缓存 对象并继续使用它。 但是,不要让 已释放DataCacheFactory对象。 DataCache对象的生命周期为 绑定到DataCacheFactory对象

你永远不必担心 与Get请求的争用。然而, 对于Put/Add请求,可以