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

 网络编程     |      2019-11-28 01:35

在大家付出的好多布满式项目里面(如基于WCF服务、Web API服务措施卡塔 尔(阿拉伯语:قطر‎,由于数量提供关乎到数据库的连锁操作,如若客商端的现身数量超越一定的数目,那么数据库的央求管理则以发生式增加,假使数据库服务器不可能迅速管理这么些现身央浼,那么将会大增客商端的号令时间,严重者只怕招致数据库服务或许应用服务直接瘫痪。缓存方案正是为那几个而诞生,随着缓存的引进,能够把数据库的IO耗时操作,调换为内部存款和储蓄器数据的快速响应操作,也许把全体页面缓存到缓存系统内部。缓存框架在各个平台之中都有无数的完成,基本上好些个是采纳遍及式缓存Redis、Memcached来贯彻。本体系小说介绍在.NET平新北,使用开源缓存框架CacheManager来达成数量的缓存的满贯经过,本篇重要介绍CacheManager的使用和相关的测试。

1、CacheManager的介绍

CacheManager是贰个以C#言语开辟的开源.Net缓存框架抽象层。它不是现实的缓存达成,但它帮助各样缓存提供者(如Redis、Memcached等卡塔 尔(英语:State of Qatar)并提供多数高等特性。
CacheManager 首要的目标使开辟者更便于管理种种复杂的缓存场景,使用CacheManager能够兑现多层的缓存,让进程内缓存在布满式缓存以前,且仅需几行代码来管理。
CacheManager 不止是一个接口去联合差别缓存提供者的编制程序模型,它使大家在二个品种里面校订缓存计谋变得极其轻易,同期也提供更加多的性状:如缓存同步、并发更新、种类号、事件管理、品质总括等等,开垦职员能够在急需的时候选用这个特色。

CacheManager的GitHub源码地址为:,假如供给实际的德姆o及表达,能够访谈其官方网址:。

行使Nuget为品种增添CacheManager包引用。CacheManager包罗了广大的Package. 在那之中CacheManager.Core是必须的,别的的指向区别缓存平台上有差别的对应Package,整个Nuget托特包含上边多少个部分的从头到尾的经过。

图片 1

CacheManager缓存框架支持Winform和Web等使用开拓,以致帮助各类风靡的缓存完毕,如MemoryCache、Redis、Memcached、Couchbase、System.Web.Caching等。

纵观整个缓存框架,它的特定很醒目,在支撑种种缓存达成外,自个儿首假设以内存缓存(进程内卡塔尔国为主,别的布满式缓存为辅的多层缓存结构格局,以完毕神速命七月管理的机制,它们之中有相关的音讯管理,使得纵然是布满式缓存,也能够登时兑现产出同步的缓存管理。

在网络充斥着基于某种单独缓存的兑现和行使的动向下,这种更抽象后生可畏层,以致提供更加高等个性的缓存框架,在提供了联合编制程序模型的幼功上,也完成了格外强劲的包容性,使得我大器晚成接触到那个框架,就对它向往。

.NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用。在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();
}

笔者们内测,一切和原先未有怎么差距,程序的记录新闻平常。

ca88会员登录 ,不过大家配备使用了Redis的缓存管理,因而得以行使“Redis Desktop Manager”软件来查阅相应的缓存数据的,打开软件大家得以观察相应的缓存记录如下所示。

图片 7

从上图大家得以查看见,我们增加的具备缓存键值都能够透过那几个Redis的顾客来展开查看,因为大家缓存里面有基于Redis缓存的兑现,同理假诺我们安顿其余的缓存完成,如MemCache等,那么也足以在对应的军管分界面上查见到。

我们做到这一个管理后,能够开采缓存数据是能够兑现多层缓存的,最为迅猛的就是内部存款和储蓄器缓存(也是它的主缓存卡塔 尔(阿拉伯语:قطر‎,它会自动同步好各种遍布式缓存的数目版本冲突难题。

引进如Redis的遍及式缓存有三个实惠,正是我们的数目可以在程序重新起动的时候,若无在内部存款和储蓄器缓存里面找到(未有击中指标卡塔尔国,那么会寻觅布满式缓存并扩充加载,进而尽管程序重启,我们事情发生以前的缓存数据照旧保存完整。

 

以上正是笔者依据对缓存框架的生机勃勃体化领悟和其角色扮演做的相干介绍,甚至介绍CacheManager的应用和后生可畏部分景观的验证,通过上面轻巧案例的钻研,大家得以稳步引进到更具实际价值的Web API 框架层面上开展应用,以期把缓存框架发挥其真正有力的市场股票总值,同临时间也为我们各个差别的缓存要求进行越来越高档案的次序的切磋,希望我们继续扶助。

 

上一篇:个人总结深入.NET平台和C#编程 下一篇:没有了