.NET缓存框架CacheManager在混合式开采框架中的应用(1)-CacheManager的介绍和使用

在大家开采的过多遍布式项目里面(如基于WCF服务、Web
API服务方法),由于数量提供关乎到数据库的相干操作,借使客户端的出现数量超过一定的数目,那么数据库的呼吁管理则以爆发式增进,若是数据库服务器不能快速管理这一个出现请求,那么将会扩充客户端的请求时间,严重者只怕引致数据库服务或然应用服务直接瘫痪。缓存方案就是为那么些而诞生,随着缓存的引进,能够把数据库的IO耗费时间操作,转变为内部存款和储蓄器数据的飞跃响应操作,只怕把全副页面缓存到缓存系统内部。缓存框架在一一平台之中都有大多的落实,基本上繁多是运用遍布式缓存Redis、Memcached来贯彻。本体系文章介绍在.NET平台南,使用开源缓存框架CacheManager来达成数量的缓存的凡事经过,本篇首要介绍CacheManager的选取和血脉相通的测试。

1、CacheManager的介绍

CacheManager是八个以C#言语开辟的开源.Net缓存框架抽象层。它不是有血有肉的缓存实现,但它帮衬种种缓存提供者(如Redis、Memcached等)并提供多数高档本性。
CacheManager
首要的目标使开采者更便于管理各类繁复的缓存场景,使用CacheManager能够达成多层的缓存,让进度内缓存在布满式缓存从前,且仅需几行代码来拍卖。
CacheManager
不唯有是多少个接口去联合分化缓存提供者的编制程序模型,它使大家在叁个品种里面改造缓存计策变得特别轻松,同不寻常间也提供更加多的特点:如缓存同步、并发更新、系列号、事件处理、质量总括等等,开拓职员能够在必要的时候接纳这几个特色。

CacheManager的GitHub源码地址为:https://github.com/MichaCo/CacheManager,如若需求实际的德姆o及表明,能够访问其官方网站:http://cachemanager.net/

运用Nuget为品种加多CacheManager包引用。CacheManager包罗了广大的Package.
个中CacheManager.Core是必须的,此外的针对性不相同缓存平台上有不一样的应和Package,整个Nuget手包含下边几个部分的剧情。

图片 1

CacheManager缓存框架援助Winform和Web等使用开荒,以及协助八种风行的缓存达成,如MemoryCache、Redis、Memcached、Couchbase、System.Web.Caching等。

综观整个缓存框架,它的特定很精晓,在支撑各个缓存完毕外,本人首倘使以内部存款和储蓄器缓存(进度内)为主,别的布满式缓存为辅的多层缓存架构格局,以完结飞速命夹钟拍卖的体制,它们中间有相关的音讯管理,使得纵然是布满式缓存,也能够马上兑现产出同步的缓存管理。

在英特网充斥着基于某种单独缓存的兑现和应用的势头下,这种更抽象一层,以及提供更加高档性子的缓存框架,在提供了统一编制程序模型的根底上,也实现了充足有力的包容性,使得笔者一接触到这几个框架,就对它喜欢。

在GitHub上,缓存框架的前几名,除了那一个缓存框架外,也还会有局地,不过从文书档案的拉长程度等各方面来看,那几个缓存框架照旧不行值得具备的。

CacheManager缓存框架在配置方面,帮忙代码格局的配备、XML配置,以及JSON格式的配备处理,极度低价。

CacheManager缓存框架默许对缓存数据的类别化是应用二进制情势,同有的时候间也支撑七种自定义系列化的法子,如依照JOSN.NET的JSON体系化可能自定义连串化格局。

CacheManager缓存框架能够对缓存记录的加多、删除、更新等有关事件进展记录。

CacheManager缓存框架的缓存数据是强类型的,能够支撑各个健康项指标拍卖,如Int、String、List类型等种种基础项目,以及可类别号的种种对象及列表对象。

CacheManager缓存框架协理多层的缓存实现,内部优质的体制能够长足、及时的一路好各层缓存的多寡。

CacheManager缓存框架援助对各个操作的日志记录。

CacheManager缓存框架在布满式缓存实现中扶助对立异的锁定和事务管理,让缓存保持更加好的共同管理,内部机制落实版本争执管理。

CacheManager缓存框架辅助二种缓存过期的拍卖,如绝对时间的晚点处理,以及定位时段的超时管理,是大家管理缓存过期越发有利。

….

过多风味基本上覆盖了缓存的寻常化个性,而且提供的接口基本上也是我们所日常用的Add、Put、Update、Remove等接口,使用起来也不行有利于。

 

2、CacheManager缓存框架的利用

经过下边前蒙受CacheManager缓存框架的简便询问,我们大约精通了它使用的一些成效,不过事实上大家怎么样利用它,大家需求做一些上学和明白,首先我们必要在总体应用框架之中,知道缓存框架所饰演的剧中人物。

诚如的话,对于单机版本的使用场景,基本上是无需引进这种缓存框架的,因为客户端的并发量不多,而且数量请求也是寥寥可数的,品质方便不会有任何难点。

假使对于布满式的利用系统,如作者在非常多小说中牵线到我的《混合式开采框架》、《Web开荒框架》,由于数量请求是并发量随着用户增进而增加的,特别对于一些网络的选取种类,极端气象下某些时刻点一下或许就能够到达了总体应用出现的峰值。那么这种布满式的种类框架结构,引进数据缓存来降低IO的并发数,把耗费时间恳求改动为内部存款和储蓄器的短平快请求,能够急剧程度的下降系统宕机的危机。

大家以基于常规的Web API层来创设利用框架为例,整个数据缓存层,应该是在Web
API层之下、业务完成层以上的贰个层,如下所示。

图片 2

在这么些数量缓存层里面,大家引进了CacheManager缓存框架,实现布满式的缓存管理,使得大家的缓存数据能够在Redis服务器上贯彻多少的拍卖,同期能够在系统重启的时候,不至于丢失数据,能够快捷恢复生机缓存数据。

为了促成对这几个CacheManager缓存框架的应用,大家须要先进行八个采取测试,以便精晓它的顺序方便情况,然后本事遍布应用在大家的数额中间层上。

咱俩树立多少个种类,并在引用的地点张开管理NuGet程序包,然后寻觅到CacheManager的连带模块应用,并进入到花色引用里面,此为第一步职业。

图片 3

图片 4

作者们成立三个客户对象类,用来模拟数据的贮存和呈现的,如下代码所示。

/// <summary>
/// 模拟数据存储的客户对象类
/// </summary>
public class Customer
{
    private static Customer m_Customer = null;
    private static ICacheManager<object> manager = null;

    //初始化列表值
    private static List<string> list = new List<string>() { "123", "456", "789" };

    /// <summary>
    /// 客户对象的单件实例
    /// </summary>
    public static Customer Instance
    {
        get
        {
            if(m_Customer == null)
            {
                m_Customer = new Customer();
            }
            if (manager == null)
            {
                manager = CacheFactory.Build("getStartedCache", settings =>
                {
                    settings.WithSystemRuntimeCacheHandle("handleName");
                }); 
            }

            return m_Customer;
        }
    }

本条类先做了三个单例的落到实处,并初始化缓存Customer类对象,以及缓存管理类ICacheManager<object>
manager,这些是大家后边用来操作缓存数据的要害引用对象。

小编们编辑多少个函数,用来兑现对数据的获得,数据增添、数据删除的有关操作,并在数额扩展、删除的时候,触发缓存的翻新,那样我们下一次获取数据的时候,正是最新的数码了。

/// <summary>
/// 获取所有客户信息
/// </summary>
/// <returns></returns>
public List<string> GetAll()
{
    var value = manager.Get("GetAll") as List<string>;
    if(value == null)
    {
        value = list;//初始化并加入缓存
        manager.Add("GetAll", value);

        Debug.WriteLine("初始化并加入列表");
    }
    else
    {
        Debug.WriteLine("访问缓存获取:{0}", DateTime.Now);
    }
    return value;
}

/// <summary>
/// 插入新的记录
/// </summary>
/// <param name="customer"></param>
/// <returns></returns>
public bool Insert(string customer)
{
    //先获取全部记录,然后加入记录
    if (!list.Contains(customer))
    {
        list.Add(customer);
    }

    //重新设置缓存
    manager.Update("GetAll", v => list);
    return true;
}

/// <summary>
/// 删除指定记录
/// </summary>
/// <param name="customer"></param>
/// <returns></returns>
public bool Delete(string customer)
{
    if(list.Contains(customer))
    {
        list.Remove(customer);
    }
    manager.Update("GetAll", v=>list);
    return true;
}

大家编辑贰个Winform程序来对那些缓存测试,以有利于了然在这之中的机制。

图片 5

作者们在测试读取的时候,也便是对GetAll实行管理,插入以及去除首要正是为着测试缓存更新的拍卖。代码如下所示。

private void btnTestSimple_Click(object sender, EventArgs e)
{
    var list = Customer.Instance.GetAll();
    Debug.WriteLine("客户端获取记录数:{0}", list != null ? list.Count : 0);
}

private void btnInsert_Click(object sender, EventArgs e)
{
    var name = "abc";
    Customer.Instance.Insert(name);
    Debug.WriteLine(string.Format("插入记录:{0}", name));
}

private void btnDelete_Click(object sender, EventArgs e)
{
    var name = "abc";
    Customer.Instance.Delete(name);
    Debug.WriteLine(string.Format("删除记录:{0}", name));
}

咱俩追踪记录,能够见到下边包车型地铁日志音讯。

图片 6

大家能够见见,当中第三次是缓存没有的意况下进展起先化,开始化的笔录数据为3个,然后插入记录后,再一次获取数据的时候,缓存更新后的数码就改为4个了。

笔者们近些日子介绍了插入记录的后台代码,它同一时候拓展了缓存数据的更新了。

/// <summary>
/// 插入新的记录
/// </summary>
/// <param name="customer"></param>
/// <returns></returns>
public bool Insert(string customer)
{
    //先获取全部记录,然后加入记录
    if (!list.Contains(customer))
    {
        list.Add(customer);
    }

    //重新设置缓存
    manager.Update("GetAll", v => list);
    return true;
}

咱俩前边介绍的缓存开首化配置的时候,暗许是运用内存缓存的,并不曾行使遍布式缓存的布置,它的起头化代码如下:

manager = CacheFactory.Build("getStartedCache", settings =>
{
    settings.WithSystemRuntimeCacheHandle("handleName");
}); 

大家在例市价形下,依然要求动用那个庞大的布满式缓存的,举个例子大家得以选取Redis的缓存管理,关于Redis的安装和平运动用,请参见笔者的小说《基于C#的MongoDB数据库开荒使用(4)–Redis的装置及应用》。

引进布满式的Redis缓存完毕,大家的布局代码只须要做肯定的转移就能够,如下所示。

manager = CacheFactory.Build("getStartedCache", settings =>
{
    settings.WithSystemRuntimeCacheHandle("handleName")

    .And
    .WithRedisConfiguration("redis", config =>
    {
        config.WithAllowAdmin()
            .WithDatabase(0)
            .WithEndpoint("localhost", 6379);
    })
    .WithMaxRetries(100)
    .WithRetryTimeout(50)
    .WithRedisBackplane("redis")
    .WithRedisCacheHandle("redis", true)
    ;
}); 

其他的利用未有其余更换,我们还要增加一些测试数据平价我们查阅对应的缓存数据。

/// <summary>
/// 测试加入几个不同的数据
/// </summary>
/// <returns></returns>
public void TestCache()
{
    manager.Put("string", "abcdefg");
    manager.Put("int", 2016);
    manager.Put("decimal", 2016.9M);
    manager.Put("date", DateTime.Now);
    manager.Put("object", new UserInfo { ID = "123", Name = "Test", Age = 35 });
}

private void btnTestSimple_Click(object sender, EventArgs e)
{
    var list = Customer.Instance.GetAll();
    Debug.WriteLine("客户端获取记录数:{0}", list != null ? list.Count : 0);

    //测试加入一些值
    Customer.Instance.TestCache();
}

我们中间测试,一切和原本未有啥样异样,程序的笔录消息寻常。

而是大家配备使用了Redis的缓存管理,因而得以采取“Redis Desktop
Manager”软件来查阅相应的缓存数据的,展开软件大家得以看来相应的缓存记录如下所示。

图片 7

从上海体育地方大家得以查看到,我们增多的有所缓存键值都足以经过那一个Redis的客户来张开查看,因为大家缓存里面有基于Redis缓存的落到实处,同理尽管大家配备其余的缓存实现,如MemCache等,那么也得以在相应的军管界面上查看到。

笔者们成功那几个管理后,能够窥见缓存数据是能够完成多层缓存的,最为迅猛的正是内部存款和储蓄器缓存(也是它的主缓存),它会自动同步好各类布满式缓存的数据版本争论难点。

引进如Redis的分布式缓存有一个益处,便是我们的数码能够在程序重新开动的时候,假使未有在内部存款和储蓄器缓存里面找到(未有击中指标),那么会招来遍及式缓存并张开加载,从而就算程序重启,大家后边的缓存数据还是保存完好。

 

以上正是本身依照对缓存框架的完好精晓和其剧中人物扮演做的相干介绍,以及介绍CacheManager的行使和局地风貌的求证,通过地方轻便案例的钻研,我们得以稳步引进到更具实际价值的Web
API
框架层面上拓展利用,以期把缓存框架发挥其真正有力的价值,同期也为大家种种分歧的缓存须要展开越来越高档期的顺序的研商,希望大家继续补助。

 

相关文章