作为一名ISV,我希望能够使用AppFabric缓存服务对我的中间层进行编程,但是能够在小型(单一服务器)环境中进行部署,而无需部署AppFabric缓存服务器。对我来说,一个“仅内存”版本的缓存客户端对于独立开发来说也是理想的选择。
然而,到目前为止我所做的所有研究都暗示我必须加载一个真正的缓存服务器才能使某些api工作,并且当前的“本地”选项不适合我的账单想。
在我看来,我正在寻找的内容与aspx会话缓存类似,因为开箱即用的机制在内存中,然后您可以选择配置较旧的外部进程提供程序,或者sql提供程序,现在是AppFabric提供程序,在您向上移动时提供更好和更好的可伸缩性。这适用于aspx会话。
我认为在AppFabric缓存的“小”环境中编程和部署没有等效的解决方案吗?
答案 0 :(得分:5)
在这个问题上提出了一些问题,让我们看看我们是否可以解决它们......
首先,作为Frode correctly points out,您可以在一台服务器上非常愉快地运行AppFabric实例 - 这是我大部分时间都在使用API。显然,高可用性功能不会是,可用,但从问题本身我认为你已经接受了。
其次,您不能将AppFabric API用于本地缓存 - 本地缓存仅用于保存AppFabric客户端通过线路连接到专用AppFabric缓存服务器。
现在,对于可配置的缓存,我认为这是最有趣的部分。我认为你想要做的是将缓存上的操作从缓存本身分离到通用接口,然后在设计时针对接口编写代码,并在运行时根据应用程序中的信息创建缓存的.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 Cache,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中的接口编程,有一个很好的,更完整的讨论。
答案 1 :(得分:0)
我们有一个设置,我们只在一台服务器上运行app fabric cache ...