.Net缓存管理框架CacheManager.Net缓存管理框架CacheManager

    
Cache缓存在计算机领域是一个吃广泛应用的定义。硬件中CPU有一级缓存,二级缓存,
浏览器被发生缓存,软件开发中吗发分布式缓存memcache,
redis。缓存无处不在的故是它们亦可极大地提高硬件及软件的运转速度。在项目支付中,性能慢的地方经常是IO操作频繁的地方,读取数据库是咱们常见的耗费性能的地方。这个时节,如果以应用频繁的多少缓存到能高效读取的介质中,下次看时,不用再失要数据库,直接由缓存中收获所欲的数码,就可知大大提高性能。这首稿子要讨论的凡当.Net开发被,如何下CacheManager框架方便之管住型中的休养存。

    
Cache缓存在计算机世界是一个被大面积采取的概念。硬件中CPU有一级缓存,二级缓存,
浏览器中起缓存,软件开发中呢有分布式缓存memcache,
redis。缓存无处不在的故是她能极大地提高硬件和软件之周转速度。在品种开中,性能慢的地方经常是IO操作频繁之地方,读取数据库是咱大的吃性能的地方。这个时节,如果以下频繁之多少缓存到能够很快读取的介质中,下次拜会时,不用再行去请数据库,直接由缓存中得到所需要的数据,就能够大大提高性能。这首文章要讨论的凡在.Net开发中,如何采取CacheManager框架方便之管制项目面临的休养生息存。

 一,CacheManager介绍与长

 一,CacheManager介绍与长

      CacheManager是开源之.Net缓存管理框架。它不是具体的复苏存实现,而是以缓存之上,方便开发人员配置与治本各种不同的缓存,为上层应用程序提供合之休养存接口的中间层。

      CacheManager是开源之.Net缓存管理框架。它不是切实可行的缓存实现,而是于缓存之上,方便开发人员配置和治本各种不同的缓存,为上层应用程序提供合之缓存接口的中间层。

    
下面是CacheManager的一对长:

    
下面是CacheManager的部分亮点:

  • 被开发人员更易处理和布局缓存,即使是非常复杂的缓存方案。
  • CacheManager能够管理又缓存,包含内存、appfabric、redis、couchbase、
    windows azure cache、memorycache等。
  • 提供了附加的法力,如缓存同步、并发更新、事件、性能计数器等…
  • 吃开发人员更易处理及布置缓存,即使是非常复杂的缓存方案。
  • CacheManager能够管理又缓存,包含内存、appfabric、redis、couchbase、
    windows azure cache、memorycache等。
  • 提供了附加的效果,如缓存同步、并发更新、事件、性能计数器等…

 二,CacheManager开始的一起

 二,CacheManager开始之一起

    
CacheManager上亲手还是非常简单的。下面采用外存缓存成CacheManager的一个实例,能够帮忙我们飞速的耳熟能详CacheManager如何使用。

    
CacheManager上亲手还是非常简单的。下面采用外存缓存成CacheManager的一个实例,能够扶助我们飞速的耳熟能详CacheManager如何使用。

    
首先以Visual Studio中开创一个Console Application.

    
首先以Visual Studio中开创一个Console Application.

 图片 1

 图片 2

    
使用Nuget啊项目添加CacheManager包引用。CacheManager包含了重重的Package.
其中CacheManager.Core是必须的,其它的对准不同缓存平台达成发生异的对应Package.

    
使用Nuget呢项目添加CacheManager包引用。CacheManager包含了成百上千之Package.
其中CacheManager.Core是要的,其它的指向不同缓存平台及发不同之呼应Package.

    
这个Demo中,我们利用内存作为缓存,所以才是待CacheManager.Core和CacheManager.SystemRuntimeCaching

    
这个Demo中,我们以内存作为缓存,所以只是内需CacheManager.Core和CacheManager.SystemRuntimeCaching

 图片 3

 图片 4

    
接着以Main函数中布置好我们的缓存:

    
接着在Main函数中安排好我们的缓存:

 1 using System;
 2 using CacheManager.Core;
 3 namespace ConsoleApplication
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             var cache = CacheFactory.Build("getStartedCache", settings =>
10             {
11                 settings.WithSystemRuntimeCacheHandle("handleName");
12             });
13         }
14     }
15 }
 1 using System;
 2 using CacheManager.Core;
 3 namespace ConsoleApplication
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             var cache = CacheFactory.Build("getStartedCache", settings =>
10             {
11                 settings.WithSystemRuntimeCacheHandle("handleName");
12             });
13         }
14     }
15 }

 

 

    
上面代码中运用CacheFactory创建了一个号为getStartedCache的苏存实例,这个缓存实例使用的凡SystemRunTime
Cache,
内存缓存。一个缓存实例是可以配备多单Handle的,我们得以应用外存来作为存储介质,也得采用Redis分布式缓存作为存储介质,并且可以而且于一个缓存实例中行使,后面我们重介绍多级缓存的配备以及以。

    
上面代码中利用CacheFactory创建了一个名号为getStartedCache的苏存实例,这个缓存实例使用的凡SystemRunTime
Cache,
内存缓存。一个缓存实例是好配备多独Handle的,我们可用外存来作为存储介质,也得使Redis分布式缓存作为存储介质,并且可以又于一个缓存实例中采用,后面我们还介绍多级缓存的部署以及应用。

    
接下来,我们抬高一些测试缓存的代码

    
接下来,我们抬高一些测试缓存的代码

 1 static void Main(string[] args)
 2 {
 4     var cache = CacheFactory.Build("getStartedCache", settings =>
 5     {
 6         settings.WithSystemRuntimeCacheHandle("handleName");
 7     });
 8 
 9     cache.Add("keyA", "valueA");
10     cache.Put("keyB", 23);
11     cache.Update("keyB", v => 42);
12     Console.WriteLine("KeyA is " + cache.Get("keyA"));      // should be valueA
13     Console.WriteLine("KeyB is " + cache.Get("keyB"));      // should be 42
14     cache.Remove("keyA");
15     Console.WriteLine("KeyA removed? " + (cache.Get("keyA") == null).ToString());
16     Console.WriteLine("We are done...");
17     Console.ReadKey();
18 }
 1 static void Main(string[] args)
 2 {
 4     var cache = CacheFactory.Build("getStartedCache", settings =>
 5     {
 6         settings.WithSystemRuntimeCacheHandle("handleName");
 7     });
 8 
 9     cache.Add("keyA", "valueA");
10     cache.Put("keyB", 23);
11     cache.Update("keyB", v => 42);
12     Console.WriteLine("KeyA is " + cache.Get("keyA"));      // should be valueA
13     Console.WriteLine("KeyB is " + cache.Get("keyB"));      // should be 42
14     cache.Remove("keyA");
15     Console.WriteLine("KeyA removed? " + (cache.Get("keyA") == null).ToString());
16     Console.WriteLine("We are done...");
17     Console.ReadKey();
18 }

 

 

老三,CacheManager多级缓存配置

    
实际开支被,我们常会需要采取多级缓存。

    
一种植常见的景是,你发出一个分布式式缓存服务器,例如redis,独立的缓存服务器会吃咱的差不多单网应用程序都能共享这些缓存的数目,因为这些缓存项的创是贵之。

    
和做客数据库相比,分布式缓存速度比快,但是跟内存相比,还是不够快。因为分布式缓存使用还欲序列化和网传输的岁月吃。

    
这个上里,做个分级缓存是单好的化解方案,将内存缓存成分布式缓存使用,使用效率高的数额直接打外存中读取,这将大大提高应用程序的完整性。

    
使用外存缓存的读取速度会达标分布式缓存的100加倍,甚至还强。

    
使用CacheManager, 配置多级缓存是均等码非常容易的工作

 1 var cache = CacheFactory.Build<int>("myCache", settings =>
 2 {
 3     settings
 4         .WithSystemRuntimeCacheHandle("inProcessCache")//内存缓存Handle
 5         .And
 6         .WithRedisConfiguration("redis", config =>//Redis缓存配置
 7         {
 8             config.WithAllowAdmin()
 9                 .WithDatabase(0)
10                 .WithEndpoint("localhost", 6379);
11         })
12         .WithMaxRetries(1000)//尝试次数
13         .WithRetryTimeout(100)//尝试超时时间
14         .WithRedisBackPlate("redis")//redis使用Back Plate
15         .WithRedisCacheHandle("redis", true);//redis缓存handle
16 });

 

      上面代码中,内存缓存和Redis缓存配置部分老爱看明白。但是BackPlate是呀打算?
接下来,我们看CacheManager中之BackPlate挡板机制。

 季,
BackPlate解决分布式缓存中的旅问题

    
对于大型的软件系统,常常都是分为多独自的子项目,各个子项目为了节省成本要是福利数据共享,常常会联手用以及一个遍布缓存服务器。这样在动用多级缓存的上,就产生或出现数量不均等的气象。

    
假设于系统A中之翻新了缓存中的一个多少项,这个时候CacheManager会在A设置的具备的复苏存handle中更新数据,这里也席卷了分布式缓存上的数额。但是于网B中之内存缓存中,还是会存在在固有的不更新的数。当系统B从缓存中得就长达记下之时段,就会并发内存缓存和分布式缓存中之多少未平等的情事。

    
为了防备这或多或少,缓存管理器有一个效应叫做cachebackplate将尝试同多个体系被的苏存。

    
上面安装的多级缓存中,我们即便以redis作为BackPlate的源.
也就是说有的数目还待盖redis中缓存的数额为底本。

    
在装redis作为BackPlate之后,同样发生点的数未雷同的景的时刻,只要redis中之数码被修改了,就会见触发CacheManager更新所有系统受的内存缓存中之数据,和redis中之数量保持一致。

    
同步的干活是什么完成的?

    
每次一样长长的缓存记录为删去或更新的时,Cache
Manager会发送一个消息,让BackPlate存储这次的数目变化信息。所有其他的网将异步接收这些信息,并将相应地作出更新和去操作,保证数据的一致性。

老三,CacheManager多级缓存配置

    
实际支付被,我们常常会用运用多级缓存。

    
一栽常见的情形是,你出一个分布式式缓存服务器,例如redis,独立的缓存服务器能够给咱的大都个网应用程序都能够共享这些缓存的多少,因为这些缓存项的始建是贵之。

    
和走访数据库相比,分布式缓存速度较快,但是跟内存相比,还是不够快。因为分布式缓存使用还索要序列化和网传输的年华吃。

    
这个上里,做只分级缓存是个好的解决方案,将内存缓存成分布式缓存使用,使用效率高之数据直接由内存中读取,这将大大提高应用程序的总体性能。

    
使用外存缓存的读取速度能够达成分布式缓存的100倍增,甚至更胜。

    
使用CacheManager, 配置多级缓存是一样码非常容易的事体

 1 var cache = CacheFactory.Build<int>("myCache", settings =>
 2 {
 3     settings
 4         .WithSystemRuntimeCacheHandle("inProcessCache")//内存缓存Handle
 5         .And
 6         .WithRedisConfiguration("redis", config =>//Redis缓存配置
 7         {
 8             config.WithAllowAdmin()
 9                 .WithDatabase(0)
10                 .WithEndpoint("localhost", 6379);
11         })
12         .WithMaxRetries(1000)//尝试次数
13         .WithRetryTimeout(100)//尝试超时时间
14         .WithRedisBackPlate("redis")//redis使用Back Plate
15         .WithRedisCacheHandle("redis", true);//redis缓存handle
16 });

 

      上面代码中,内存缓存和Redis缓存配置有好易看明白。但是BackPlate是啊作用?
接下来,我们看看CacheManager中之BackPlate挡板机制。

 季,
BackPlate解决分布式缓存中之齐问题

    
对于大型的软件系统,常常都是分为多独门的子项目,各个子项目为了省去本钱还是是利数据共享,常常会并用和一个遍布缓存服务器。这样于运多级缓存的上,就发生或出现数未雷同的状态。

    
假设于系统A中之换代了缓存中的一个数目项,这个时CacheManager会在A设置的有所的休养生息存handle中创新数据,这里呢包括了分布式缓存上之多寡。但是当网B中之内存缓存中,还是会设有在原始的无更新的数目。当系统B从缓存中赢得就长达记下的下,就见面产出内存缓存和分布式缓存中之数据未均等的气象。

    
为了以防这一点,缓存管理器有一个成效叫做cachebackplate将尝试同多只网遭到之缓存。

    
上面安装的泛滥成灾缓存中,我们就是拿redis作为BackPlate的源.
也就是说有的数额还需要为redis中缓存的多少为蓝本。

    
在装redis作为BackPlate之后,同样发生点的数码未一致的情况的时刻,只要redis中之多少让改了,就会见触发CacheManager更新所有系统遭到之内存缓存中的数量,和redis中之数保持一致。

    
同步的办事是怎形成的?

    
每次一样漫长缓存记录受删去或更新的时光,Cache
Manager会发送一个消息,让BackPlate存储这次的数码变动信息。所有其他的系将异步接收这些信,并将相应地作出更新与去操作,保证数据的一致性。

五,ExpirationMode和CacheUpdateMode

    
涉及到缓存,就一定产生缓存过期的问题。CacheManager中提供了一些略的休息存过期方式设置。

1 public enum ExpirationMode
2 {
3     None = 0,
4     Sliding = 1,
5     Absolute = 2,
6 }

 

    
同时CacheManager还吧千家万户缓存中设置不同的数目更新策略

1 public enum CacheUpdateMode
2 {
3     None = 0,
4     Full = 1,
5     Up = 2,
6 }

 

    
使用Sliding和Up,
我们本身好啊浩如烟海缓存设置不同的休息存过期时刻,这样使效率高的数额就是能保存在访问速度更快之内存中,访问频率次强之停放分布式缓存中。当CacheManager在内存中搜寻不交缓存数据的下,就见面尝试当分布式缓存中觅。找到后,根据Up设置,会再用该缓存数据保存至外存缓存着。

    
具体的安排方式如下:

 1 var cache = CacheFactory.Build<int>("myCache", settings =>
 2 {
 3     settings.WithUpdateMode(CacheUpdateMode.Up)
 4         .WithSystemRuntimeCacheHandle("inProcessCache")//内存缓存Handle
 5         .WithExpiration(ExpirationMode.Sliding, TimeSpan.FromSeconds(60)))
 6         .And
 7         .WithRedisConfiguration("redis", config =>//Redis缓存配置
 8         {
 9             config.WithAllowAdmin()
10                 .WithDatabase(0)
11                 .WithEndpoint("localhost", 6379);
12         }).
13         .WithExpiration(ExpirationMode.Sliding, TimeSpan. FromHours  (24)))
14         .WithMaxRetries(1000)//尝试次数
15         .WithRetryTimeout(100)//尝试超时时间
16         .WithRedisBackPlate("redis")//redis使用Back Plate
17         .WithRedisCacheHandle("redis", true);//redis缓存handle
18 
19 });

 

五,ExpirationMode和CacheUpdateMode

    
涉及到缓存,就一定产生缓存过期的问题。CacheManager中提供了片概括的复苏存过期方式设置。

1 public enum ExpirationMode
2 {
3     None = 0,
4     Sliding = 1,
5     Absolute = 2,
6 }

 

    
同时CacheManager还吧千家万户缓存中设置不同之数码更新策略

1 public enum CacheUpdateMode
2 {
3     None = 0,
4     Full = 1,
5     Up = 2,
6 }

 

    
使用Sliding和Up,
我们自家得以吧浩如烟海缓存设置不同的苏存过期时光,这样以效率高的数量就是能保存在访问速度更快的内存中,访问频率次大之嵌入分布式缓存中。当CacheManager在内存中觅不交缓存数据的上,就见面尝试当分布式缓存中检索。找到后,根据Up设置,会再次以该缓存数据保存至外存缓存着。

    
具体的配置方式如下:

 1 var cache = CacheFactory.Build<int>("myCache", settings =>
 2 {
 3     settings.WithUpdateMode(CacheUpdateMode.Up)
 4         .WithSystemRuntimeCacheHandle("inProcessCache")//内存缓存Handle
 5         .WithExpiration(ExpirationMode.Sliding, TimeSpan.FromSeconds(60)))
 6         .And
 7         .WithRedisConfiguration("redis", config =>//Redis缓存配置
 8         {
 9             config.WithAllowAdmin()
10                 .WithDatabase(0)
11                 .WithEndpoint("localhost", 6379);
12         }).
13         .WithExpiration(ExpirationMode.Sliding, TimeSpan. FromHours  (24)))
14         .WithMaxRetries(1000)//尝试次数
15         .WithRetryTimeout(100)//尝试超时时间
16         .WithRedisBackPlate("redis")//redis使用Back Plate
17         .WithRedisCacheHandle("redis", true);//redis缓存handle
18 
19 });

 

六,缓存使用分析

    
在缓存使用受到,对于缓存hit和miss数据态比较关系,这些多少会帮忙我们解析以及调动缓存的设置,帮助缓存使用地更客观。

1 var cache = CacheFactory.Build("cacheName", settings => settings
2     .WithSystemRuntimeCacheHandle("handleName")
3         .EnableStatistics()
4         .EnablePerformanceCounters());

 

    
在布局好缓存的Statistic功能后,我们就算会跟至缓存的应用状态了,
下面就是个别打印各个缓存handle中之辨析数据。

 1 foreach (var handle in cache.CacheHandles)
 2 {
 3     var stats = handle.Stats;
 4     Console.WriteLine(string.Format(
 5             "Items: {0}, Hits: {1}, Miss: {2}, Remove: {3}, ClearRegion: {4}, Clear: {5}, Adds: {6}, Puts: {7}, Gets: {8}",
 6                 stats.GetStatistic(CacheStatsCounterType.Items),
 7                 stats.GetStatistic(CacheStatsCounterType.Hits),
 8                 stats.GetStatistic(CacheStatsCounterType.Misses),
 9                 stats.GetStatistic(CacheStatsCounterType.RemoveCalls),
10                 stats.GetStatistic(CacheStatsCounterType.ClearRegionCalls),
11                 stats.GetStatistic(CacheStatsCounterType.ClearCalls),
12                 stats.GetStatistic(CacheStatsCounterType.AddCalls),
13                 stats.GetStatistic(CacheStatsCounterType.PutCalls),
14                 stats.GetStatistic(CacheStatsCounterType.GetCalls)
15             ));
16 }

 

六,缓存使用分析

    
在缓存使用受到,对于缓存hit和miss数据态比较关系,这些数据可知帮助我们解析与调整缓存的安,帮助缓存使用地进一步客观。

1 var cache = CacheFactory.Build("cacheName", settings => settings
2     .WithSystemRuntimeCacheHandle("handleName")
3         .EnableStatistics()
4         .EnablePerformanceCounters());

 

    
在布置好缓存的Statistic功能后,我们就是会跟及缓存的动情况了,
下面就个别打印各个缓存handle中之解析数据。

 1 foreach (var handle in cache.CacheHandles)
 2 {
 3     var stats = handle.Stats;
 4     Console.WriteLine(string.Format(
 5             "Items: {0}, Hits: {1}, Miss: {2}, Remove: {3}, ClearRegion: {4}, Clear: {5}, Adds: {6}, Puts: {7}, Gets: {8}",
 6                 stats.GetStatistic(CacheStatsCounterType.Items),
 7                 stats.GetStatistic(CacheStatsCounterType.Hits),
 8                 stats.GetStatistic(CacheStatsCounterType.Misses),
 9                 stats.GetStatistic(CacheStatsCounterType.RemoveCalls),
10                 stats.GetStatistic(CacheStatsCounterType.ClearRegionCalls),
11                 stats.GetStatistic(CacheStatsCounterType.ClearCalls),
12                 stats.GetStatistic(CacheStatsCounterType.AddCalls),
13                 stats.GetStatistic(CacheStatsCounterType.PutCalls),
14                 stats.GetStatistic(CacheStatsCounterType.GetCalls)
15             ));
16 }

 

七,结尾

    
缓存是只好东西,用好了力所能及极大的增高性能。缓存的动自家是独十分十分之话题,这边文章只是从缓存管理这角度介绍了CachManager的利用。

    
下面是CacheManager相关的素材和链接:

    
官方主页

     http://cachemanager.net/

    
源代码

     https://github.com/MichaCo/CacheManager

    
官方MVC项目的Sample

    
https://github.com/MichaCo/CacheManager/tree/master/samples/CacheManager.Samples.Mvc

    
最近于思维不同状况下缓存使用的分问题。对于互联网项目以来,数据的一致性要求时不绝强,缓存管理着,关注点可能在缓存的命中率达。对于使用体系,访问请求不甚,但是对于数据的一致性要求比高,缓存中之多寡更新策略可能逾重大。

争才是好之适合下系统的缓存设计也罢?
如果大家发出趣味,欢迎探讨指教。

文章转载自:http://www.cnblogs.com/JustRun1983/p/CacheManager.html

七,结尾

    
缓存是独好东西,用好了能够极大的增长性。缓存的采取自家是独雅充分之话题,这边文章只是从缓存管理这角度介绍了CachManager的施用。

    
下面是CacheManager相关的材料与链接:

    
官方主页

     http://cachemanager.net/

    
源代码

     https://github.com/MichaCo/CacheManager

    
官方MVC项目的Sample

    
https://github.com/MichaCo/CacheManager/tree/master/samples/CacheManager.Samples.Mvc

    
最近在盘算不同情形下缓存使用的分问题。对于互联网项目以来,数据的一致性要求时不顶胜,缓存管理面临,关注点可能以缓存的命中率达到。对于以系统,访问请求不要命,但是对数据的一致性要求比较高,缓存中的多寡更新策略可能逾重点。

哪些才是好之合采取体系的缓存设计呢?
如果大家发出趣味,欢迎探讨指教。

章转载自:http://www.cnblogs.com/JustRun1983/p/CacheManager.html

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注