设为首页 加入收藏

TOP

.Net缓存管理框架CacheManager(二)
2019-09-17 19:05:44 】 浏览:48
Tags:.Net 管理 框架 CacheManager
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 });

 

六,缓存使用分析

     在缓存使用中,对于缓存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  st
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Redis到底该如何利用? 下一篇java 快速开发平台 有代码生成器 ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目