作为一名独立软件开发商,我希望能够使用AppFabric缓存服务对我的中间层进行编程,然后能够在小型(单个服务器)环境中部署,而无需部署AppFabric缓存服务器。对我来说,“仅在内存中”版本的缓存客户端对于独立开发来说也是非常理想的。
然而,到目前为止,我所做的所有研究都表明,我必须加载一个真正的缓存服务器才能使一些apis工作,并且当前的"Local“选项并不适合我想要的。
在我看来,我正在寻找的工作方式类似于aspx会话缓存,因为开箱即用的机制在内存中,然后你可以选择配置旧的外部进程提供程序,或者sql提供程序,现在是AppFabric提供程序,随着你的发展,提供越来越好的可伸缩性。这对于aspx会话非常有效。
我认为在AppFabric缓存的“小”环境中没有等效的编程和部署解决方案,这是正确的吗?
发布于 2011-09-13 05:55:49
在这个问题中提出了许多问题,让我们看看我们是否可以解决它们……
首先也是最重要的是,作为Frode correctly points out,您可以在一台服务器上运行AppFabric实例-这是我大部分时间都在做的事情。显然,高可用性功能将不会是可用的,但从问题本身来看,我认为您已经接受了这一点。
其次,您不能对本地缓存使用AppFabric API -本地缓存只是为了保存AppFabric客户端穿越线路到专用AppFabric缓存服务器的行程。
现在,到可配置缓存,我认为这是最有趣的部分。我认为您在这里要做的是将缓存上的操作从缓存本身分离到一个通用接口中,然后在设计时根据接口编写代码,在运行时根据app.config/web.config中的信息创建缓存。
所以让我们从定义我们的接口开始:
public interface IGenericCache
{
void Add(string key, object value);
void Remove(string key);
Object Get(string key);
void Update(string key, object value);
}现在我们可以定义两个实现,一个使用MemoryCache,另一个使用AppFabric。
using System.Runtime.Caching;
class GenericMemoryCache : IGenericCache
{
public void Add(string key, object value)
{
MemoryCache cache = new MemoryCache("GenericMemoryCache");
cache.Add(key, value, null, null);
}
public void Remove(string key)
{
MemoryCache cache = new MemoryCache("GenericMemoryCache");
cache.Remove(key, null);
}
public object Get(string key)
{
MemoryCache cache = new MemoryCache("GenericMemoryCache");
return cache.Get(key, null);
}
public void Update(string key, object value)
{
MemoryCache cache = new MemoryCache("GenericMemoryCache");
cache.Set(key, value, null, null);
}
}
using Microsoft.ApplicationServer.Caching;
class GenericAppFabricCache : IGenericCache
{
private DataCacheFactory factory;
private DataCache cache;
public GenericAppFabricCache()
{
factory = new DataCacheFactory();
cache = factory.GetCache("GenericAppFabricCache");
}
public void Add(string key, object value)
{
cache.Add(key, value);
}
public void Remove(string key)
{
cache.Remove(key);
}
public object Get(string key)
{
return cache.Get(key);
}
public void Update(string key, object value)
{
cache.Put(key, value);
}
}我们可以继续使用ASP.NET缓存、NCache、memcached来编写IGenericCache实现。
现在我们添加一个工厂类,它使用反射根据app.config/web.config中的值创建其中一个缓存的实例。
class CacheFactory
{
private static IGenericCache cache;
public static IGenericCache GetCache()
{
if (cache == null)
{
// Read the assembly and class names from the config file
string assemblyName = ConfigurationManager.AppSettings["CacheAssemblyName"];
string className = ConfigurationManager.AppSettings["CacheClassName"];
// Load the assembly, and then instantiate the implementation of IGenericCache
Assembly assembly = Assembly.LoadFrom(assemblyName);
cache = (IGenericCache) assembly.CreateInstance(className);
}
return cache;
}
}在客户端代码需要使用缓存的地方,所需要的就是调用CacheFactory.GetCache,并返回配置文件中指定的缓存,但是客户端不需要知道它是哪个缓存,因为客户端代码都是针对接口编写的。这意味着您只需更改配置文件中的设置即可向外扩展缓存。
本质上,我们在这里编写的是一个用于缓存的插件模型,但请注意,您正在牺牲灵活性来换取特性。接口或多或少必须是最小的公分母--你失去了使用AppFabric的并发模型或标签API的能力。
有一篇关于在this article中使用接口进行编程的精彩且更完整的讨论。
发布于 2011-08-28 01:25:15
我们有一个设置,我们只在一台服务器上运行app fabric缓存...
https://stackoverflow.com/questions/7207365
复制相似问题