.NET缓存框架CacheManager在混合式开发框架中的应用(一)-CacheManager的介绍和利用

2、CacheManager缓存框架的运用

经过地点对CacheManager缓存框架的归纳询问,我们大致明白了它选择的有的功力,可是事实上大家怎么选择它,大家需求做一些学习和询问,首先大家必要在全方位应用框架之中,知道缓存框架所扮演的剧中人物。

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

假设对于分布式的行使系统,如自身在无数随笔中牵线到自笔者的《混合式开发框架》、《Web开发框架》,由于数量请求是并发量随着用户增加而进步的,越发对于部分互连网的利用系统,极端气象下有个别时刻点一下可能就会达到了方方面面应用出现的峰值。那么那种分布式的类别架构,引入数据缓存来降低IO的并发数,把耗费时间恳请改换为内部存款和储蓄器的相当慢请求,能够大幅程度的暴跌系统宕机的风险。

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

图片 1

在这么些数据缓存层里面,大家引进了CacheManager缓存框架,完成分布式的缓存处理,使得大家的缓存数据能够在Redis服务器上落到实处数据的拍卖,同时能够在系统重启的时候,不至于丢失数据,可以急迅苏醒缓存数据。

为了落到实处对那么些CacheManager缓存框架的施用,我们须要先进行二个行使测试,以便领会它的种种方便意况,然后才能广泛应用在我们的数目中间层上。

咱俩建立四个类型,并在引用的地点打开管理NuGet程序包,然后搜索到CacheManager的有关模块应用,并参加到项目引用里面,此为第一步工作。

图片 2

图片 3

我们创立贰个客户对象类,用来效仿数据的蕴藏和出示的,如下代码所示。

/// <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;
        }
    }

以此类先做了1个单例的落到实处,并初阶化缓存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程序来对那一个缓存测试,以方便明白其中的编写制定。

图片 4

我们在测试读取的时候,约等于对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));
}

我们跟踪记录,能够见见上面包车型大巴日记音讯。

图片 5

小编们得以看到,当中第三次是缓存未有的事态下进行起初化,伊始化的记录数据为一个,然后插入记录后,再次获取数据的时候,缓存更新后的数据就改成多少个了。

大家日前介绍了插入记录的后台代码,它同时展开了缓存数据的换代了。

/// <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)
    ;
}); 

其余的利用未有别的变更,我们同时扩张1些测试数据便宜大家查阅对应的缓存数据。

/// <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”软件来查六柱预测应的缓存数据的,打开软件我们能够看来相应的缓存记录如下所示。

图片 6

从上航海用教室我们得以查看到,大家抬高的有所缓存键值都足以通过那一个Redis的客户来进行查看,因为我们缓存里面有基于Redis缓存的贯彻,同理要是大家安顿别的的缓存达成,如MemCache等,那么也能够在相应的保管界面上查看到。

我们做到那些处理后,能够窥见缓存数据是能够达成多层缓存的,最为迅猛的就是内部存款和储蓄器缓存(也是它的主缓存),它会自行同步好各类分布式缓存的数目版本争执难题。

引进如Redis的分布式缓存有贰个好处,正是大家的数量能够在程序重新开动的时候,尽管未有在内部存款和储蓄器缓存里面找到(未有击中目的),那么会寻找分布式缓存并开始展览加载,从而即便程序重启,大家以前的缓存数据仍然保存完整。

 

以上便是自身遵照对缓存框架的总体明白和其剧中人物扮演做的连带介绍,以及介绍CacheManager的利用和一些光景的印证,通过地方简单案例的讨论,大家能够稳步引进到更具实际价值的Web
API
框架层面上开始展览利用,以期把缓存框架发挥其确实有力的价值,同时也为我们各个差异的缓存须求开始展览更高层次的探讨,希望大家继续帮忙。

 

在大家开发的浩大分布式项目里面(如依照WCF服务、Web
API服务方法),由于数量提供关乎到数据库的连带操作,假诺客户端的出现数量超过一定的多少,那么数据库的请求处理则以产生式增长,倘若数据库服务器不可能飞快处理那些出现请求,那么将会增添客户端的乞求时间,严重者可能引致数据库服务可能应用服务直接瘫痪。缓存方案正是为那个而诞生,随着缓存的引进,可以把数据库的IO耗费时间操作,转换为内部存储器数据的快速响应操作,或然把全副页面缓存到缓存系统内部。缓存框架在各样平台之中都有那三个的落实,基本上多数是使用分布式缓存Redis、Memcached来促成。本连串文章介绍在.NET平斯特拉斯堡,使用开源缓存框架CacheManager来完结多少的缓存的成套进程,本篇首要介绍CacheManager的接纳和血脉相通的测试。

1、CacheManager的介绍

CacheManager是3个以C#言语开发的开源.Net缓存框架抽象层。它不是现实性的缓存达成,但它支持多种缓存提供者(如Redis、Memcached等)并提供更仆难数高级本性。
CacheManager
首要的指标使开发者更易于处理各样复杂的缓存场景,使用CacheManager能够兑现多层的缓存,让进程内缓存在分布式缓存在此以前,且仅需几行代码来处理。
CacheManager
不仅仅是3个接口去联合分裂缓存提供者的编制程序模型,它使我们在叁个类型里面改变缓存策略变得万分简单,同时也提供更加多的特征:如缓存同步、并发更新、种类号、事件处理、品质总结等等,开发人士能够在要求的时候选用这一个特征。

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

使用Nuget为项目添加CacheManager包引用。CacheManager包涵了很多的Package.
当中CacheManager.Core是必须的,其它的针对性不一样缓存平台上有差异的照应Package,整个Nuget托特包含上面多少个部分的情节。

图片 7

CacheManager缓存框架援助Winform和Web等利用开发,以及帮助四种风行的缓存实现,如MemoryCache、Redis、Memcached、Couchbase、System.Web.Caching等。

纵观整个缓存框架,它的一定很肯定,在帮助三种缓存完结外,本人主假诺以内存缓存(进度内)为主,别的分布式缓存为辅的多层缓存架构格局,以完结急忙命大壮处理的机制,它们之中有相关的新闻处理,使得即便是分布式缓存,也能够霎时实现产出同步的缓存处理。

在网上充斥着基于某种单独缓存的落实和平运动用的来头下,那种更抽象1层,以及提供越来越尖端性子的缓存框架,在提供了合并编制程序模型的基础上,也促成了要命强劲的包容性,使得小编壹接触到这几个框架,就对它喜欢。

在GitHub上,缓存框架的前几名,除了那些缓存框架外,也还有一部分,然而从文书档案的丰裕程度等各地点来看,这几个缓存框架如故要命值得拥有的。

CacheManager缓存框架在布局方面,帮忙代码方式的布置、XML配置,以及JSON格式的配置处理,万分有益。

CacheManager缓存框架暗中同意对缓存数据的体系化是行使二进制方式,同时也匡助各种自定义连串化的点子,如依据JOSN.NET的JSON种类化只怕自定义系列化形式。

CacheManager缓存框架能够对缓存记录的加码、删除、更新等城门失火事件展开记录。

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

CacheManager缓存框架支持多层的缓存达成,内部优质的编写制定能够高速、及时的一块好各层缓存的数码。

CacheManager缓存框架协助对种种操作的日志记录。

CacheManager缓存框架在分布式缓存实现中扶助对创新的锁定和事务处理,让缓存保持越来越好的1块儿处理,内部机制落到实处版本争持处理。

CacheManager缓存框架援救二种缓存过期的拍卖,如相对时间的过期处理,以及定位时段的逾期处理,是我们处理缓存过期尤其方便人民群众。

….

成都百货上千特点基本上覆盖了缓存的正规性子,而且提供的接口基本上也是我们所常常用的Add、Put、Update、Remove等接口,使用起来也相当方便。

 

相关文章