AppFabric Cache独立模式?

0 appfabric

作为一名ISV,我希望能够使用AppFabric缓存服务对我的中间层进行编程,然后能够在小型(单一服务器)环境中进行部署,而无需部署AppFabric缓存服务器.对我来说,一个"仅内存"版本的缓存客户端对于独立开发来说也是理想的选择.

然而,到目前为止我所做的所有研究都意味着我必须加载一个真正的缓存服务器来使一些api工作,并且当前的"Local"选项不适合我想要的账单.

在我看来,我正在寻找的将类似于aspx会话缓存,因为开箱即用的机制是在内存中,然后你可以选择配置旧的外部进程提供程序,或sql提供程序,现在是AppFabric提供商,在您向上移动时提供更好,更好的可扩展性.这适用于aspx会话.

我是否认为在AppFabric缓存的"小"环境中编程和部署没有等效的解决方案?

Phi*_*ove 5

在这个问题中提出了一些问题,让我们看看我们是否可以解决这些问题......

首先,正如Frode正确指出的那样,您可以在一台服务器上非常愉快地运行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);
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以定义几个实现,一个使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以继续使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在客户端代码需要使用缓存的任何地方,所需要的只是一个调用CacheFactory.GetCache,并且将返回配置文件中指定的缓存,但是客户端不需要知道它是哪个缓存,因为客户端代码都是写在界面上.这意味着您只需更改配置文件中的设置即可扩展缓存.

基本上我们在这里写的是用于缓存的插件模型,但请注意,您正在牺牲功能的灵活性.界面必须或多或少是最低的共同点 - 你失去了使用AppFabric的并发模型或标记API的能力.

有编程的反对界面的优秀,更全面的讨论这篇文章.