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