我正在寻找最安全的方式来安排appFabric缓存调用的datacache和datacache工厂的使用,每页加载400到700个缓存(几乎没有任何放置).似乎使用单个静态DataCacheFactory(或者可能是循环设置中的一对)是要走的路.
我是否为每个DataCache对象请求调用GetCache("cacheName"),还是在初始化DataCache工厂时将其设置为静态并将其用于所有调用?
我是否必须处理异常,检查失败代码并尝试重试?
当多个线程尝试使用缓存存储并且想要相同的项目(按键)时,是否必须考虑争用?
是否有某种文档正确地探讨了它的设计和用法?
我到目前为止从论坛收集的一些信息:
http://social.msdn.microsoft.com/Forums/en-AU/velocity/thread/98d4f00d-3a1b-4d7c-88ba-384d3d5da915
"创建工厂涉及到连接到集群并且可能需要一些时间.但是一旦你拥有了工厂对象和你想要使用的缓存,你可以简单地重用这些对象来执行put并进入缓存,你应该看到更快的表现."
http://social.msdn.microsoft.com/Forums/en-US/velocity/thread/0c1d7ce2-4c1b-4c63-b525-5d8f98bb8a49
"创建单个DataCacheFactory(singleton)比创建多个DataCacheFactory更有效.你不应该为每个调用创建DataCacheFactory,它会有性能损失."
"请尝试在您的单例中封装循环算法(具有3/4/5工厂实例)并比较负载测试结果."
http://blogs.msdn.com/b/velocity/archive/2009/04/15/pushing-client-performance.aspx
"您可以增加客户端数量以增加缓存吞吐量.但有时如果您希望拥有较小的客户端集并增加吞吐量,则需要使用多个DataCacheFactory实例.DataCacheFactory实例创建与服务器的连接(例如, .g如果有3个服务器,它将创建3个连接)并将来自数据缓存的所有请求多路复用到这些连接上.因此,如果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;
}
}
Run Code Online (Sandbox Code Playgroud)
在Microsoft AppFabric论坛上查看此问题:http://social.msdn.microsoft.com/Forums/en-AU/velocity/thread/e0a0c6fb-df4e-499f-a023-ba16afb6614f
使用VS2012我从WebRole属性缓存选项卡添加了缓存功能.其中,它在web.config中生成以下XML:
<dataCacheClients>
<tracing sinkType="DiagnosticSink" traceLevel="Error" />
<dataCacheClient name="default">
<autoDiscover isEnabled="true" identifier="[cluster role name]"/>
<!-- <localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" /> -->
</dataCacheClient>
</dataCacheClients>
Run Code Online (Sandbox Code Playgroud)
好,太棒了.我将[cluster role name]替换为webrole的名称,例如"helloworld.web".现在,当我创建DataCacheFactory或DataCache对象时:
_dataCacheFactory = new DataCacheFactory();
_defaultCache = _dataCacheFactory.GetDefaultCache();
//Or, just this line
_defaultCache = new DataCache(@"default");
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Microsoft.ApplicationServer.Caching.DataCacheException was unhandled
HelpLink=http://go.microsoft.com/fwlink/?LinkId=164049
HResult=-2146233088
Message=ErrorCode<ERRCA0021>:SubStatus<ES0001>:Server collection cannot be empty.
Source=Microsoft.ApplicationServer.Caching.Client
ErrorCode=21
SubStatus=-1
Some notes:
IDE: VS2012,
Framework: 4.0
AzureSDK: June2012
Local dev machine
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
编辑
我得到了它的工作!
我在WebRole OnStart方法中创建了DataCacheFactory,我将它移到了Global.asax中的Application_Start,它似乎正在工作.
Sandrino解释了为什么会出现这种情况:https://stackoverflow.com/a/11886136/1374935
我已成功开始使用Azure AppFabric缓存服务,但我不确定创建DataCacheFactory对象的最佳实践方法是什么.现在我正在为缓存中的每次调用创建它,但显然这不是理想的做法...
有人建议要求单身人士.但我不确定我是否理解这将如何实现(不是实际的Singleton类,而是如何将它们组合在一起).
今天我有一个使用Ninject为我创建的CacheProvider类,我可以在其中执行Get/Put/Remove操作.对于这些方法中的每一个,我创建DataCacheFactory对象,然后调用.GetDefaultCache()来获取DataCache对象,我分别调用Put/Get/Remove.我在一个看起来像这样的方法中这样做:
private T Cache<T>(Func<DataCache, T> cacheAction)
{
using (DataCacheFactory dataCacheFactory = new DataCacheFactory())
{
DataCache dataCache = dataCacheFactory.GetDefaultCache();
return cacheAction(dataCache);
}
}
Run Code Online (Sandbox Code Playgroud)
我现在很确定这不是那么聪明的想法,我应该通过Singleton获取DataCache对象,其中DataCacheFactory对象只创建一次.但是这个对象如何在请求之间存活?如何在Azure上使用> 1个实例?
希望这一切都有意义,而且比我更有经验的人(3个小时)可以帮助我.