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

更新时间:2023-07-29 02:00:24 阅读: 评论:0

cachemanage管理_.Net缓存管理框架CacheManager
Cache缓存在计算机领域是⼀个被普遍使⽤的概念。硬件中CPU有⼀级缓存,⼆级缓存, 浏览器中有缓存,软件开发中也有分布式缓存memcache, redis。缓存⽆处不在的原因是它能够极⼤地提⾼硬件和软件的运⾏速度。在项⽬开发中,性能慢的地⽅常常是IO操作频繁的地⽅,读取数据库是我们常见的消耗性能的地⽅。这个时候,如果将使⽤频繁的数据缓存到能够⾼速读取的介质中,下次访问时,不⽤再去请求数据库,直接从缓存中获取所需的数据,就能够⼤⼤提⾼性能。这篇⽂章主要讨论的是在.Net开发中,如何使⽤CacheManager框架⽅便的管理项⽬中的缓存。
⼀,CacheManager介绍以及优点
CacheManager是开源的.Net缓存管理框架。它不是具体的缓存实现,⽽是在缓存之上,⽅便开发⼈员配置和管理各种不同的缓存,为上层应⽤程序提供统⼀的缓存接⼝的中间层。
下⾯是CacheManager的⼀些优点: 让开发⼈员的⽣活更容易处理和配资缓存,即使是⾮常复杂的缓存⽅案。
CacheManager能够管理多种缓存,包含 内存, appfabric, redis, couchba, windows azure cache, memorycache等。
提供了额外的功能,如缓存同步、并发更新、事件、性能计数器等…
⼆,CacheManager开始之旅
CacheManager上⼿还是⾮常简单的。下⾯使⽤内存缓存结合CacheManager的⼀个实例,能够帮助我们快速的熟悉CacheManager如何使⽤。
⾸先在Visual Studio中创建⼀个Console Application.
使⽤Nuget为项⽬添加CacheManager包引⽤。CacheManager包含了很多的Package. 其中CacheManager.Core是必须的,其它的针对不同缓存平台上有不同的对应Package.
这个Demo中,我们使⽤内存作为缓存,所以只是需要CacheManager.Core和CacheManager.SystemRuntimeCaching
接着在Main函数中配置好我们的缓存:红酒怎么醒酒
1 usingSystem;
安宁天皇2 usingCacheManager.Core;
3 namespaceConsoleApplication
4 {
5 classProgram
6 {
7 static void Main(string[] args)
8 {
9 var cache = CacheFactory.Build("getStartedCache", ttings =>
10 {11 ttings.WithSystemRuntimeCacheHandle("handleName");12 });13 }14 }15 }
上⾯代码中使⽤CacheFactory创建了⼀个名称为getStartedCache的缓存实例,这个缓存实例使⽤的是SystemRunTime Cache, 内存缓存。⼀个缓存实例是可以配置多个Handle的,我们可以使⽤内存来作为存储介质,也可以使⽤Redis分布式缓存作为存储介质,并且可以同时在⼀个缓存实例中使⽤,后⾯我们再介绍多级缓存的配置和使⽤。
接下来,我们添加⼀些测试缓存的代码
1 static void Main(string[] args)
2 {3
4 var cache = CacheFactory.Build("getStartedCache", ttings =>
5 {
6 ttings.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 ");17 Console.ReadKey();18 }
三,CacheManager多级缓存配置
实际开发中,我们常常会需要使⽤多级缓存。
⼀种常见的情况是,你有⼀个分布式式缓存服务器,例如redis,独⽴的缓存服务器能够让我们的多个系统应⽤程序都能够共享这些缓存的数据,因为这些缓存项的创建是昂贵的。
和访问数据库相⽐,分布式缓存速度较快,但是和内存相⽐,还是不够快。因为分布式缓存使⽤还需要序列化和⽹络传输的时间消耗。
这个时候⾥,做个分级缓存是个好的解决⽅案,将内存缓存结合分布式缓存使⽤,使⽤频率⾼的数据直接从内存中读取,这将⼤⼤提⾼应⽤程序的整体性能。
使⽤内存缓存的读取速度能够达到分布式缓存的100倍,甚⾄更⾼。
使⽤CacheManager, 配置多级缓存是⼀件⾮常容易的事情
1 var cache = CacheFactory.Build("myCache", ttings =>
2 {
3 ttings
4 .WithSystemRuntimeCacheHandle("inProcessCache")//内存缓存Handle
5 .And
6 .WithRedisConfiguration("redis", config =>//Redis缓存配置
7 {8 config.WithAllowAdmin()9 .WithDataba(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 enumExpirationMode
2 {
3 None = 0,
4 Sliding = 1,
5 Absolute = 2,
6 }
同时CacheManager还为多级缓存之间设置不同的数据更新策略
1 public enumCacheUpdateMode虎头双钩
作家江南2 {
3 None = 0,
诺氟沙星胶囊的作用
4 Full = 1,
5 Up = 2,
6 }
使⽤Sliding和Up, 我们我可以为多级缓存设置不同的缓存过期时间,这样使⽤频率⾼的数据就能够保存在访问速度更快的内存中,访问频率次⾼的放到分布式缓存中。当CacheManager在内存中找不到缓存数据的时候,就会尝试在分布式缓存中找。找到后,根据Up设置,会再将该缓存数据保存到内存缓存中。
具体的配置⽅式如下:
1 var cache = CacheFactory.Build("myCache", ttings =>
2 {
3 ttings.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 .WithDataba(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", ttings =>ttings
2 .WithSystemRuntimeCacheHandle("handleName")3
.EnableStatistics()4 .EnablePerformanceCounters());
奥巴梅扬
中国最高学位在配置好缓存的Statistic功能后,我们就能够跟踪到缓存的使⽤情况了, 下⾯就是分别打印各个缓存handle中的分析数据。
1 foreach (var handle incache.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.Miss),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相关的资料和链接:
官⽅主页
源代码
官⽅MVC项⽬的Sample
最近在思考不同情况下缓存使⽤的区别问题。对于互联⽹项⽬来说,数据的⼀致性要求常常不太⾼,缓存管理中,关注点可能在缓存的命中率上。对于应⽤系统,访问请求不⼤,但是对于数据的⼀致性要求较⾼,缓存中的数据更新策略可能更加重要。
怎样才是好的适合应⽤系统的缓存设计呢? 如果⼤家有兴趣,欢迎探讨指教。

本文发布于:2023-07-29 02:00:24,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1100331.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:缓存   数据   内存   分布式   能够
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图